Skip to content

Instantly share code, notes, and snippets.

@zacharycarter
Created April 8, 2017 02:04
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save zacharycarter/302fe50d2f70950d4d83e542ca1dcd06 to your computer and use it in GitHub Desktop.
Save zacharycarter/302fe50d2f70950d4d83e542ca1dcd06 to your computer and use it in GitHub Desktop.
#[ Written in 2015 by Sebastiano Vigna (vigna@acm.org)
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