Skip to content

Random123 Family

Random123 is a library of "counter-based" random number generators (CBRNGs), developed by D.E.Shaw Research1. Counter-based means the RNGs in this family can produce the $\mathrm{N}^\textrm{th}$ number by applying a stateless mixing function to the counter $\mathrm{N}$, instead of the conventional approach of using $\mathrm{N}$ iterations of a stateful transformation. The current version of Random123 in this package is 1.09, and there are four kinds of RNGs: Threefry, Philox, AESNI, ARS.

The original paper1 says all the RNGs in Random123 can pass Big Crush in TestU01, but in the benchmark we did, ARS1x128 and Philox2x64 have a slight failure.

Random123 RNGs

All the RNG types in Random123 have a property ctr1, which denotes to its first counter, and some of them have ctr2 for the second counter. The suffix '-1x', '-2x' and '-4x' indicates how many numbers will be generated per time. The first one or two or four properties of a RNG type in Random123 are always x(or x1, x2, etc.), which denote to the produced numbers.

Threefry

Threefry is a non-cryptographic adaptation of the Threefish block cipher from the Skein Hash Function.

In this package, there are two Types of Threefry: Threefry4x and Threefry2x. Besides the output type T, there is another parameter R, which denotes to the number of rounds, and must be at least 1 and no more than 32. With 20 rounds (by default), Threefry has a considerable safety margin over the minimum number of rounds with no known statistical flaws, but still has excellent performance. They both support UInt32 and UInt64 output.

Philox

Philox uses a Feistel network and integer multiplication.

Philox also has two Types: Philox4x and Philox2x. The number of rounds must be at least 1 and no more than 16. With 10 rounds (by default), Philox2x32 has a considerable safety margin over the minimum number of rounds with no known statistical flaws, but still has excellent performance. They both support UInt32 and UInt64 output.

AESNI

AESNI uses the Advanced Encryption Standard (AES) New Instruction, available on certain modern x86 processors (some models of Intel Westmere and Sandy Bridge, and AMD Interlagos, as of 2011). AESNI CBRNGs can operate on UInt128 type.

AESNI has two Types: AESNI1x and AESNI4x. AESNI4x only internally converts UInt128 to UInt32.

ARS

ARS (Advanced Randomization System) is a non-cryptographic simplification of AESNI.

ARS has two Types: ARS1x and ARS4x. ARS4x only internally converts UInt128 to UInt32. Note that although it uses some cryptographic primitives, ARS1x uses a cryptographically weak key schedule and is not suitable for cryptographic use. The number of rounds must be at least 1 and no more than 10, and is 7 by default.

Examples

For detailed usage of each RNG, please refer to the library docs.

To use Random123, firstly import the module:

julia> using RandomNumbers.Random123

Take Philox4x64 for example:

julia> r = Philox4x();  # will output UInt64 by default, and two seed integers are truly randomly produced.

julia> r = Philox4x((0x12345678abcdef01, 0x10fedcba87654321));  # specify the seed.

julia> r = Philox4x(UInt64, (0x12345678abcdef01, 0x10fedcba87654321));  # specify both the output type and seed.

julia> rand(r, NTuple{4, UInt64})
(0x00d626ee85b7d2ed, 0xa57b4af2b68c655e, 0x82dad737de789de2, 0x8d390e05845e6c4d)

julia> set_counter!(r, 123);  # update the counter manually.

julia> rand(r, UInt64, 4)
4-element Array{UInt64,1}:
 0x56a4eb812faa9cd7
 0xf3d3464a49b23b56
 0xda5a5824aea0b2bb
 0x097a8d117a2bb20a

julia> set_counter!(r, 0);

julia> rand(r, NTuple{4, UInt64})
(0x00d626ee85b7d2ed, 0xa57b4af2b68c655e, 0x82dad737de789de2, 0x8d390e05845e6c4d)

  1. John K. Salmon, Mark A. Moraes, Ron O. Dror, and David E. Shaw, "Parallel Random Numbers: As Easy as 1, 2, 3," Proceedings of the International Conference for High Performance Computing, Networking, Storage and Analysis (SC11), New York, NY: ACM, 2011. doi:10.1145/2063384.2063405