Pseudorandom number generator
A pseudorandom number generator, also known as a deterministic random bit generator, is an algorithm for generating a sequence of numbers whose properties approximate the properties of sequences of random numbers. The PRNG-generated sequence is not truly random, because it is completely determined by an initial value, called the PRNG's seed. Although sequences that are closer to truly random can be generated using hardware random number generators, pseudorandom number generators are important in practice for their speed in number generation and their reproducibility.
PRNGs are central in applications such as simulations, electronic games, and cryptography. Cryptographic applications require the output not to be predictable from earlier outputs, and more elaborate algorithms, which do not inherit the linearity of simpler PRNGs, are needed.
Good statistical properties are a central requirement for the output of a PRNG. In general, careful mathematical analysis is required to have any confidence that a PRNG generates numbers that are sufficiently close to random to suit the intended use. John von Neumann cautioned about the misinterpretation of a PRNG as a truly random generator, and joked that "Anyone who considers arithmetical methods of producing random digits is, of course, in a state of sin."
Potential problems with deterministic generators
In practice, the output from many common PRNGs exhibit artifacts that cause them to fail statistical pattern-detection tests. These include:- Shorter-than-expected periods for some seed states ;
- Lack of uniformity of distribution for large quantities of generated numbers;
- Correlation of successive values;
- Poor dimensional distribution of the output sequence;
- Distances between where certain values occur are distributed differently from those in a random sequence distribution.
In many fields, research work prior to the 21st century that relied on random selection or on Monte Carlo simulations, or in other ways relied on PRNGs, were much less reliable than ideal as a result of using poor-quality PRNGs. Even today, caution is sometimes required, as illustrated by the following warning in the International Encyclopedia of Statistical Science.
As an illustration, consider the widely used programming language Java., Java still relies on a linear congruential generator for its PRNG, which are of low quality—see further below.
One well-known PRNG to avoid major problems and still run fairly quickly was the Mersenne Twister, which was published in 1998. Other higher-quality PRNGs, both in terms of computational and statistical performance, were developed before and after this date; these can be identified in the List of pseudorandom number generators.
Generators based on linear recurrences
In the second half of the 20th century, the standard class of algorithms used for PRNGs comprised linear congruential generators. The quality of LCGs was known to be inadequate, but better methods were unavailable. Press et al. described the result thusly: "If all scientific papers whose results are in doubt because of were to disappear from library shelves, there would be a gap on each shelf about as big as your fist."A major advance in the construction of pseudorandom generators was the introduction of techniques based on linear recurrences on the two-element field; such generators are related to linear feedback shift registers.
The 1997 invention of the Mersenne Twister, in particular, avoided many of the problems with earlier generators. The Mersenne Twister has a period of 219 937−1 iterations, is proven to be equidistributed in 623 dimensions, and at the time of its introduction was running faster than other statistically reasonable generators.
In 2003, George Marsaglia introduced the family of xorshift generators, again based on a linear recurrence. Such generators are extremely fast and, combined with a nonlinear operation, they pass strong statistical tests.
In 2006 the WELL family of generators was developed. The WELL generators in some ways improves on the quality of the Mersenne Twister—which has a too-large state space and a very slow recovery from state spaces with a large number of zeros.
Cryptographically secure pseudorandom number generators
A PRNG suitable for cryptographic applications is called a cryptographically secure PRNG. A requirement for a CSPRNG is that an adversary not knowing the seed has only negligible advantage in distinguishing the generator's output sequence from a random sequence. In other words, while a PRNG is only required to pass certain statistical tests, a CSPRNG must pass all statistical tests that are restricted to polynomial time in the size of the seed. Though a proof of this property is beyond the current state of the art of computational complexity theory, strong evidence may be provided by reducing the CSPRNG to a problem that is assumed to be hard, such as integer factorization. In general, years of review may be required before an algorithm can be certified as a CSPRNG.Some classes of CSPRNGs include the following:
- stream ciphers
- block ciphers running in counter or output feedback mode
- PRNGs that have been designed specifically to be cryptographically secure, such as Microsoft's Cryptographic Application Programming Interface function CryptGenRandom, the Yarrow algorithm, and Fortuna
- combination PRNGs which attempt to combine several PRNG primitive algorithms with the goal of removing any detectable non-randomness
- special designs based on mathematical hardness assumptions: examples include the Micali–Schnorr generator, Naor-Reingold pseudorandom function and the Blum Blum Shub algorithm, which provide a strong security proof
- generic PRNGs: while it has been shown that a secure PRNG can be constructed generically from any one-way function, this generic construction is extremely slow in practice, so is mainly of theoretical interest.
Most PRNG algorithms produce sequences that are uniformly distributed by any of several tests. It is an open question, and one central to the theory and practice of cryptography, whether there is any way to distinguish the output of a high-quality PRNG from a truly random sequence. In this setting, the distinguisher knows that either the known PRNG algorithm was used or a truly random algorithm was used, and has to distinguish between the two. The security of most cryptographic algorithms and protocols using PRNGs is based on the assumption that it is infeasible to distinguish use of a suitable PRNG from use of a truly random sequence. The simplest examples of this dependency are stream ciphers, which work by exclusive or-ing the plaintext of a message with the output of a PRNG, producing ciphertext. The design of cryptographically adequate PRNGs is extremely difficult because they must meet additional criteria. The size of its period is an important factor in the cryptographic suitability of a PRNG, but not the only one.
BSI evaluation criteria
The German Federal Office for Information Security has established four criteria for quality of deterministic random number generators. They are summarized here:- K1 – There should be a high probability that generated sequences of random numbers are different from each other.
- K2 – A sequence of numbers is indistinguishable from "truly random" numbers according to specified statistical tests. The tests are the monobit test, poker test, runs test, longruns test —both from BSI and NIST, and the autocorrelation test. In essence, these requirements are a test of how well a bit sequence: has zeros and ones equally often; after a sequence of n zeros, the next bit a one with probability one-half; and any selected subsequence contains no information about the next element in the sequence.
- K3 – It should be impossible for an attacker to calculate, or otherwise guess, from any given subsequence, any previous or future values in the sequence, nor any inner state of the generator.
- K4 – It should be impossible, for all practical purposes, for an attacker to calculate, or guess from an inner state of the generator, any previous numbers in the sequence or any previous inner generator states.
Mathematical definition
Given- – a probability distribution on
- – a non-empty collection of Borel sets, e.g.. If is not specified, it may be either or, depending on context.
- – a non-empty set. Often is a set between 's support and its interior; for instance, if is the uniform distribution on the interval, might be. If is not specified, it is assumed to be some set contained in the support of and containing its interior, depending on context.
Early approaches
An early computer-based PRNG, suggested by John von Neumann in 1946, is known as the middle-square method. The algorithm is as follows: take any number, square it, remove the middle digits of the resulting number as the "random number", then use that number as the seed for the next iteration. For example, squaring the number "1111" yields "1234321", which can be written as "01234321", an 8-digit number being the square of a 4-digit number. This gives "2343" as the "random" number. Repeating this procedure gives "4896" as the next result, and so on. Von Neumann used 10 digit numbers, but the process was the same.A problem with the "middle square" method is that all sequences eventually repeat themselves, some very quickly, such as "0000". Von Neumann was aware of this, but he found the approach sufficient for his purposes and was worried that mathematical "fixes" would simply hide errors rather than remove them.
Von Neumann judged hardware random number generators unsuitable, for, if they did not record the output generated, they could not later be tested for errors. If they did record their output, they would exhaust the limited computer memories then available, and so the computer's ability to read and write numbers. If the numbers were written to cards, they would take very much longer to write and read. On the ENIAC computer he was using, the "middle square" method generated numbers at a rate some hundred times faster than reading numbers in from punched cards.
The middle-square method has since been supplanted by more elaborate generators.
A recent innovation is to combine the middle square with a Weyl sequence. This method produces high-quality output through a long period.
Non-uniform generators
Numbers selected from a non-uniform probability distribution can be generated using a uniform distribution PRNG and a function that relates the two distributions.First, one needs the cumulative distribution function of the target distribution :
Note that. Using a random number c from a uniform distribution as the probability density to "pass by", we get
so that
is a number randomly selected from distribution.
For example, the inverse of cumulative Gaussian distribution with an ideal uniform PRNG with range as input would produce a sequence of values with a Gaussian distribution; however
- When using practical number representations, the infinite "tails" of the distribution have to be truncated to finite values.
- Repetitive recalculation of should be reduced by means such as ziggurat algorithm for faster generation.