Philox4x32-10
This is a keyed family of counter-based BRNGs. The state consists of 128-bit integer counter
c
and two 32-bit keys k
0
and k
1
. The generator has 32-bit integer output obtained in the following way [Salmon2011]:- cn=cn-1+ 1
- wn=f(cn), wherefis a function that takes a 128-bit argument and returns a 128-bit number. The returned number is obtained as follows:
- The argumentcis interpreted as four 32-bit numbers
, where
, put
k00=k0andk10=k1. - The following recurrence is calculated:Wheremulhi(a,b)andmullo(a,b)are high and low 32-bit parts of the a*b product, respectively.
- Putf(c) =
, where
N= 10
- Integer output:r4n+k=wn(k), wherewn(k)is thek-th 32-bit integer in quadruplewn,k= 0, 1, 2, 3
- Real output:un=(int)rn/232+½
Real Implementation (Single and Double Precision)
The output vector is the sequence of the floating-point values
u
0
, u
1
, ...Integer Implementation
The output vector of 32-bit integers
r
0
, r
1
, ...Stream Initialization by Function
vslNewStream
Philox4x32-10 generates the stream and initializes it specifying the 32-bit input integer parameter seed. The stream state is a 128-bit number
c
and a pair of 32-bit integers k
0
and k
1
initialized in the following way:- Assumek0= seed.
- Assume the other values are equal to 0, that isk1= 0 andc= 0.
Stream Initialization by Function
vslNewStreamEx
Philox4x32-10 generates the stream and initializes it specifying the array
params[]
of n
32-bit integers:- Ifn= 0, assumec=k0=k1= 0.
- Ifn= 1, assumek= params[0],c= 0.
- Ifn= 2, assumek= params[0] + params[1]*232,c= 0.
- Ifn= 3, assumek= params[0] + params[1]*232,c= params[2].
- Ifn= 4, assumek= params[0] + params[1]*232,c= params[2] + params[3]*232.
- Ifn= 5, assumek= params[0] + params[1]*232,c= params[2] + params[3]*232+ params[4]*264.
- Ifn>= 6, assumek= params[0] + params[1]*232,c= params[2] + params[3]*232+ params[4]*264+ params[5]*296.
Subsequences Selection Methods
vslSkipAheadStream | Supported |
vslSkipAheadStreamEx | Supported |
vslLeapfrogStream | Not supported |
Generator Period

Empirical Testing Results Summary
Test Name | vsRngUniform | vdRngUniform | viRngUniform | viRngUniformBits |
---|---|---|---|---|
3D Spheres Test | OK (20% errors) | OK (20% errors) | Not applicable | OK (20% errors) |
Birthday Spacing Test | Not applicable | Not applicable | Not applicable | OK (0% errors) |
Bitstream Test | Not applicable | Not applicable | Not applicable | OK (15% errors) |
Rank of 31x31 Binary Matrices Test | Not applicable | Not applicable | Not applicable | OK (10% errors) |
Rank of 32x32 Binary Matrices Test | Not applicable | Not applicable | Not applicable | OK (0% errors) |
Rank of 6x8 Binary Matrices Test | Not applicable | Not applicable | Not applicable | OK (0% errors) |
Counts-the-1’s Test (stream of bits) | Not applicable | Not applicable | Not applicable | OK (0% errors) |
Counts-the-1’s Test (stream of specific bytes) | Not applicable | Not applicable | Not applicable | OK (0% errors) |
Craps Test | OK (20% errors) | OK (20% errors) | OK (20% errors) | OK (20% errors) |
Parking Lot Test | OK (0% errors) | OK (0% errors) | Not applicable | OK (0% errors) |
2D Self-Avoiding Random Walk Test | OK (10% errors) | OK (0% errors) | Not applicable | OK (0% errors) |
- The tabulated data is obtained using the one-level (threshold) testing technique. The OK result indicates FAIL < 50%. The run fails when p-value falls outside the interval [0.05, 0.95].
- The stream tested is generated by calling the functionvslNewStreamwith seed=7,777,777.