Random
A collection of Pseudo Random Number Generators (PRNG) algorithms for the
Crystal language. Each implementation implements the Random
interface.
Continuation of the crystal-random shard.
Installation
Add the shard:
dependencies:
random:
github: ysbaddaden/random.cr
Usage
You may require random/all
to include all algorithms, but it is recommended to
specify the chosen algorithms such as random/xorshift128plus
for example.
Algorithms
Sorted by increasing state.
|PRNG |w |speed (x86)|speed (arm)|State |Splittable|Cryptography|TestU01 |Comment|
|-----------------------------|------|-----------|-----------|----------|----------|------------|-----------|-------|
|Random::XorShift32
|32-bit|4.01ns |3.24ns |2$^{32} |No |No |Fails |too many TESTU01 failures|
|Random::ISAAC
(stdlib) |32-bit|8.02ns |8.71ns |2$^{64} |No |Yes |- ||
|Random::PCG32
(stdlib) |32-bit|4.41ns |3.77ns |2$^{64} |No |No |Big Crush ||
|Random::PCG64
|64-bit|4.47ns |7.20ns |2$^{64} |No |No |? ||
|Random::SplitMix64
|64-bit|3.77ns |4.13ns |2$^{64} |No |No |Big Crush |used to seed XoShiRo128
and XoShiRo256
|
|Random::Splittable
|64-bit|3.46ns |3.91ns |2$^{64} |Yes |No |Big Crush ||
|Random::XorShift64
|64-bit|3.55ns |2.52ns ! |2$^{64} |No |No |Fails ||
|Random::XorShift64Plus
|32-bit|4.47ns |3.77ns |2$^{64} |No |No |Small Crush|for Float32
numbers|
|Random::XorShift64Star
|64-bit|3.51ns |3.01ns |2$^{64} |No |No |Fails |for Float64
numbers|
|Random::XoRoShiRo64StarStar
|32-bit|4.75ns |4.10ns |2$^{64} |No |No |Big Crush |all purpose generator|
|Random::WyRand
|64-bit|3.15ns ! |5.18ns |2$^{64} |No |No |Big Crush ||
|Random::Lehmer64
|64-bit|3.15ns ! |5.53ns |2$^{128} |No |No |Big Crush |simplest|
|Random::Splittable128
|64-bit|4.24ns |4.70ns |2$^{128} |Yes |No |Big Crush ||
|Random::XorShift128
|32-bit|5.97ns |4.89ns |2$^{128} |No |No |Fails ||
|Random::XorShift128Plus
|64-bit|3.38ns |2.91ns |2$^{128} |No |No |? |for Float64
numbers|
|Random::XoShiRo128StarStar
|32-bit|5.23ns |4.15ns |2$^{128} |Yes |No |Big Crush |all purpose generator|
|Random::XoShiRo128Plus
|32-bit|5.04ns |4.28ns |2$^{128} |Yes |No |? |for Float32
numbers|
|Random::XoShiRo256PlusPlus
|64-bit|4.07ns |3.60ns |2$^{256} |Yes |No |Big Crush |all purpose generator|
|Random::XoShiRo256StarStar
|64-bit|3.97ns |3.50ns |2$^{256} |Yes |No |Big Crush |all purpose generator|
|Random::XoShiRo256Plus
|64-bit|3.90ns |3.76ns |2$^{256} |Yes |No |? |for Float64
numbers|
|Random::XorShift1024Star
|64-bit|3.77ns |4.00ns |2$^{1024} |Yes |No |Fails |for massive parallel computations|
|Random::MT19937
|32-bit|6.64ns |5.13ns |2$^{19937}|No |No |Fails |Mersenne Twister (removed from stdlib)|
The Plus
and Star
scrambles for the xorshift family (including xoshiro and
xoroshiro) all fail BigCrush, but are still statistically correct enough to
generate floating-point numbers (either Float32
or Float64
) since their
weakest bits are skipped.
The algorithms were benchmarked on an Intel Core i7-4712HQ (Haswell) and an Neoverse-N1 ARM server.
The TESTU01 results are aggregated from the following pages by Sebastiano Vigna and Daniel Lemire, as well as different papers.
- https://prng.di.unimi.it/
- https://github.com/lemire/testingRNG
- https://arxiv.org/pdf/1402.6246
- https://arxiv.org/pdf/1404.0390
TODO:
- [ ]
Random::ISAAC64
- [ ]
Random::ChaCha12
- [ ]
Random::ChaCha20
Maybe also:
- [ ]
Random::MWC128
- [ ]
Random::MWC256
- [ ]
Random::MWC512
- [ ]
Random::GMWC128
- [ ]
Random::GMWC256
- [ ]
Random::WELL512
- [ ]
Random::WELL1024
- [ ]
Random::WELL19937
- [ ]
Random::WELL44497
- [ ]
Random::XorWow
- [ ]
Random::XoRoShiRo64Star
- [ ]
Random::XoRoShiRo128Plus
- [ ]
Random::XoRoShiRo128PlusPlus
- [ ]
Random::XoRoShiRo128StarStar
- [ ]
Random::XoShiRo512Plus
- [ ]
Random::XoShiRo512PlusPlus
- [ ]
Random::XoShiRo512StarStar
- [ ]
Random::XoRoShiRo1024PlusPlus
- [ ]
Random::XoRoShiRo1024StarStar
- [ ]
Random::XoRoShiRo1024Star
License
Distributed under the Apache-2.0 license.
Contributors
- Julien Portalier (@ysbaddaden)
- crystal-lang The Crystal Lang Team - creator, maintainer