A counter-based random number generation (CBRNG, also known as a counter-based pseudo-random number generator, or CBPRNG) is a kind of pseudorandom number generator that uses only an integer counter as its internal state. They are generally used for generating pseudorandom numbers for large parallel computations.
We can think of a pseudorandom number generator (PRNG) as a function that transforms a series of bits known as the state into a new state and a random number.
That is, given a PRNG function and an initial state
state0
In some PRNGs, such as the Mersenne Twister, the state is large, more than 2048 bytes. In other PRNGs, such as xorshift,
statei
numi
statei
state0
state1
state2
i
Such algorithms are inherently sequential and not amenable to running on parallel machines like multi-core CPUs and GPUs.
In contrast, a counter-based random number generator (CBRNG) is a PRNG where the state "evolves" in a particularly simple manner:
statei=i
This property make it easy to run a CBRNG on a multiple CPU threads or a GPU. For example, to generate
n
n
i
PRNG(i)
Some CBRNGs are based on reduced-strength versions of block ciphers. Below we explain how this works.
When using a cryptographic block cipher in counter mode, you generate a series of blocks of random bits. The
i
i
k
Blocki=E(i,k)
This is similar to a CBRNG, where you calculate the
i
PRNG(i)
PRNG(i)=E(i,seed)
This yields a strong, cryptographically-secure source of randomness. But cryptographically-secure pseudorandom number generators tend to be slow compared to insecure PRNGs, and in practice many uses of random numbers don't require this degree of security.
In 2011, Salmon et al. at D. E. Shaw Research introduced[1] two CBRNGs based on reduced-strength versions of block ciphers.
ARS is used in recent versions of Intel's Math Kernel Library[3] and gets good performance by using instructions from the AES-NI instruction set, which specifically accelerate AES encryption.
Code implementing Threefry, ARS, and Philox (see below) is available from the authors.[4]
In addition to Threefry and ARS, Salmon et al. described a third counter-based PRNG, Philox, based on wide multiplies; e.g. multiplying two 32-bit numbers and producing a 64-bit number, or multiplying two 64-bit numbers and producing a 128-bit number.
As of 2020, Philox is popular on CPUs and GPUs. On GPUs, nVidia's library[5] and TensorFlow[6] provide implementations of Philox. On CPUs, Intel's MKL provides an implementation.
A new CBRNG based on multiplication is the Squares RNG.[7] This generator passes stringent tests of randomness[8] and is considerably faster than Philox.