Created
April 8, 2017 02:04
-
-
Save zacharycarter/302fe50d2f70950d4d83e542ca1dcd06 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#[ Written in 2015 by Sebastiano Vigna ([email protected]) | |
To the extent possible under law, the author has dedicated all copyright | |
and related and neighboring rights to this software to the public domain | |
worldwide. This software is distributed without any warranty. | |
See <http://creativecommons.org/publicdomain/zero/1.0/>. ]# | |
#[ This is a fixed-increment version of Java 8's SplittableRandom generator | |
See http://dx.doi.org/10.1145/2714064.2660195 and | |
http://docs.oracle.com/javase/8/docs/api/java/util/SplittableRandom.html | |
It is a very fast generator passing BigCrush, and it can be useful if | |
for some reason you absolutely want 64 bits of state; otherwise, we | |
rather suggest to use a xoroshiro128+ (for moderately parallel | |
computations) or xorshift1024* (for massively parallel computations) | |
generator. ]# | |
var x*: uint64 # The state can be seeded with any value. | |
proc next*(): uint64 = | |
x += 0x9E3779B97F4A7C15u64 | |
var z = x | |
z = (z xor `shr`(z, 30)) * 0xBF58476D1CE4E5B9u64 | |
z = (z xor `shr`(z, 27)) * 0x94D049BB133111EBu64 | |
z xor `shr`(z, 31) | |
when isMainModule: | |
x = 0 | |
assert next() == 16294208416658607535u64 | |
x = 100 | |
assert next() == 2532601429470541124u64 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment