summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorTyge Løvset <[email protected]>2020-08-02 00:07:48 +0200
committerTyge Løvset <[email protected]>2020-08-02 00:07:48 +0200
commit61bf766fd557db5f94ae86fbe390d64ef8644ee1 (patch)
tree5eb3ff7b1e100a9d321eb1d34961d19ed7d59aed
parenteb748a6f7778237e77ca1704fd857e3570c1e9c4 (diff)
downloadSTC-modified-61bf766fd557db5f94ae86fbe390d64ef8644ee1.tar.gz
STC-modified-61bf766fd557db5f94ae86fbe390d64ef8644ee1.zip
Update SFC64
-rw-r--r--stc/crandom.h28
1 files changed, 15 insertions, 13 deletions
diff --git a/stc/crandom.h b/stc/crandom.h
index e687ce76..04e5eaa0 100644
--- a/stc/crandom.h
+++ b/stc/crandom.h
@@ -116,35 +116,37 @@ STC_API uint32_t crandom_gen_i32(crandom_eng32_t* rng) {
return (xors >> rot) | (xors << ((-rot) & 31));
}
-/* New 64bit PRNG losely based on SFC64: Copyright 2020, Tyge Løvset */
-/* Faster: Updates only 192bit state. Parallel: Ensures unique sequence for each seq (2^63 seqs) */
-/* Minimal period is 2^64 per seq, average ~ 2^127 per seq */
STC_API crandom_eng64_t crandom_eng64_with_seq(uint64_t seed, uint64_t seq) {
crandom_eng64_t rng = {seed, seed, seed, (seq << 1u) | 1u}; /* increment must be odd */
for (int i = 0; i < 12; ++i) crandom_gen_i64(&rng);
return rng;
}
+#ifdef STC_USE_SFC64
+/* SFC64 random number generator: http://pracrand.sourceforge.net */
STC_API uint64_t crandom_gen_i64(crandom_eng64_t* rng) {
enum {LROT = 24, RSHIFT = 11, LSHIFT = 3};
uint64_t *s = rng->state;
- const uint64_t b = s[1], result = s[0] ^ (s[2] += s[3]|1);
- s[0] = (b + (b << LSHIFT)) ^ (b >> RSHIFT);
- s[1] = ((b << LROT) | (b >> (64 - LROT))) + result;
+ const uint64_t result = s[0] + s[1] + s[3]++;
+ s[0] = s[1] ^ (s[1] >> RSHIFT);
+ s[1] = s[2] + (s[2] << LSHIFT);
+ s[2] = ((s[2] << LROT) | (s[2] >> (64 - LROT))) + result;
return result;
}
-
-/* // SFC64 random number generator: http://pracrand.sourceforge.net
+#else
+/* My own PRNG inspired by SFC64: Faster and has Weyl-sequence parameter. */
+/* Copyright Tyge Løvset, 2020 */
+/* Faster: updates only 192bit state. Parallel: Ensures unique sequence per seq (2^63) */
+/* Minimum period is 2^64 per seq, average ~ 2^127 per seq */
STC_API uint64_t crandom_gen_i64(crandom_eng64_t* rng) {
enum {LROT = 24, RSHIFT = 11, LSHIFT = 3};
uint64_t *s = rng->state;
- const uint64_t result = s[0] + s[1] + s[3]++;
- s[0] = s[1] ^ (s[1] >> RSHIFT);
- s[1] = s[2] + (s[2] << LSHIFT);
- s[2] = ((s[2] << LROT) | (s[2] >> (64 - LROT))) + result;
+ const uint64_t b = s[1], result = s[0] ^ (s[2] += s[3]|1);
+ s[0] = (b + (b << LSHIFT)) ^ (b >> RSHIFT);
+ s[1] = ((b << LROT) | (b >> (64 - LROT))) + result;
return result;
}
-*/
#endif
#endif
+#endif