Simplify output for UInt's
Fix incorrect rand_int output
Fix spelling in comments
WIP warning - not recommended for any real-world use.
Exceptionally fast and beautifully simple non-cryptographically secure hashing function and psuedo-random number generator for modern processors.
This is a native crystal implementation of wyhash.
Paper (pdf) with further background.
Comparisons below against cystal-lang's current PRNG (PCG32).
> crystal run benchmark/perf.cr --release
#next_u (direct PRNG cycle output)
pcg32 440.63M ( 2.27ns) (± 1.38%) 0.0B/op 1.40x slower
wyrand 615.84M ( 1.62ns) (± 1.71%) 0.0B/op fastest
UInt32 (native for PCG32)
pcg32 440.51M ( 2.27ns) (± 1.15%) 0.0B/op 1.40x slower
wyrand 614.72M ( 1.63ns) (± 1.31%) 0.0B/op fastest
UInt64 (native for wyrand)
pcg32 59.52M ( 16.80ns) (± 0.96%) 0.0B/op 10.12x slower
wyrand 602.20M ( 1.66ns) (± 6.02%) 0.0B/op fastest
Random bytes (10MB)
pcg32 53.74 ( 18.61ms) (±11.09%) 10.0MB/op 2.25x slower
wyrand 120.78 ( 8.28ms) (± 6.45%) 10.0MB/op fastest
UInt8 (1..n)
pcg32 170.91M ( 5.85ns) (± 1.17%) 0.0B/op 2.57x slower
wyrand 438.72M ( 2.28ns) (± 2.38%) 0.0B/op fastest
UInt16 (1..n)
pcg32 204.95M ( 4.88ns) (± 0.93%) 0.0B/op 2.11x slower
wyrand 432.88M ( 2.31ns) (± 4.26%) 0.0B/op fastest
UInt32 (1..n)
pcg32 125.08M ( 7.99ns) (± 0.91%) 0.0B/op 3.44x slower
wyrand 430.53M ( 2.32ns) (± 6.82%) 0.0B/op fastest
UInt64 (1..n)
pcg32 48.72M ( 20.52ns) (± 0.49%) 0.0B/op 12.62x slower
wyrand 614.89M ( 1.63ns) (± 0.88%) 0.0B/op fastest
> crystal run benchmark/gen.cr --release
user system total real
:pcg32 18.859614 6.215003 25.074617 ( 46.954726)
:wyrand 8.027272 6.257800 14.285072 ( 43.712943)
> ent pcg32.out
Entropy = 8.000000 bits per byte.
Optimum compression would reduce the size
of this 10737418240 byte file by 0 percent.
Chi square distribution for 10737418240 samples is 262.41, and randomly
would exceed this value 36.15 percent of the times.
Arithmetic mean value of data bytes is 127.5001 (127.5 = random).
Monte Carlo value for Pi is 3.141557000 (error 0.00 percent).
Serial correlation coefficient is -0.000012 (totally uncorrelated = 0.0).
> ent wyrand.out
Entropy = 8.000000 bits per byte.
Optimum compression would reduce the size
of this 10737418240 byte file by 0 percent.
Chi square distribution for 10737418240 samples is 231.31, and randomly
would exceed this value 85.40 percent of the times.
Arithmetic mean value of data bytes is 127.5000 (127.5 = random).
Monte Carlo value for Pi is 3.141572366 (error 0.00 percent).
Serial correlation coefficient is 0.000002 (totally uncorrelated = 0.0).
A comprehensive set of algorithmic benchmarks and comparisons to other PRNG's is availble externally.