List of random number generators
Random number generators are important in many kinds of technical applications, including physics, engineering or mathematical computer studies (e.g., Monte Carlo simulations), cryptography and gambling (on game servers).
This list includes many common types, regardless of quality or applicability to a given use case.
Pseudorandom number generators (PRNGs)
The following algorithms are pseudorandom number generators.
Generator | Date | First proponents | References | Notes |
---|---|---|---|---|
Middle-square method | 1946 | J. von Neumann | [1] | In its original form, it is of poor quality and of historical interest only. |
Lehmer generator | 1951 | D. H. Lehmer | [2] | One of the very earliest and most influential designs. |
Linear congruential generator (LCG) | 1958 | W. E. Thomson; A. Rotenberg | [3][4] | A generalisation of the Lehmer generator and historically the most influential and studied generator. |
Lagged Fibonacci generator (LFG) | 1958 | G. J. Mitchell and D. P. Moore | [5] | |
Linear-feedback shift register (LFSR) | 1965 | R. C. Tausworthe | [6] | A hugely influential design. Also called Tausworthe generators. |
Wichmann–Hill generator | 1982 | B. A. Wichmann and D. I. Hill | [7] | A combination of three small LCGs, suited to 16-bit CPUs. Widely used in many programs, e.g. it is used in Excel 2003 and later versions for the Excel function RAND[8] and it was the default generator in the language Python up to version 2.2.[9] |
Rule 30 | 1983 | S. Wolfram | [10] | Based on cellular automata. |
Inversive congruential generator (ICG) | 1986 | J. Eichenauer and J. Lehn | [11] | |
Blum Blum Shub | 1986 | M. Blum, L. Blum and M. Shub | [12] | Blum-Blum-Shub is a PRNG algorithm that is considered cryptographically secure. Its base is based on prime numbers. |
Park-Miller generator | 1988 | S. K. Park and K. W. Miller | [13] | A specific implementation of a Lehmer generator, widely used because it is included in C++ as the function minstd_rand0 from C++11 onwards.[14]
|
ACORN generator | 1989 (discovered 1984) | R. S. Wikramaratna | [15][16] | The Additive Congruential Random Number generator.
Simple to implement, fast, but not widely known. With appropriate initialisations, passes all current empirical test suites, and is formally proven to converge. Easy to extend for arbitrary period length and improved statistical performance over higher dimensions and with higher precision. |
MIXMAX generator | 1991 | G. K. Savvidy and N. G. Ter-Arutyunyan-Savvidy | [17] | It is a member of the class of matrix linear congruential generator, a generalisation of LCG. The rationale behind the MIXMAX family of generators relies on results from ergodic theory and classical mechanics. |
Add-with-carry (AWC) | 1991 | G. Marsaglia and A. Zaman | [18] | A modification of Lagged-Fibonacci generators. |
Subtract-with-borrow (SWB) | 1991 | G. Marsaglia and A. Zaman | [18] | A modification of Lagged-Fibonacci generators. A SWB generator is the basis for the RANLUX generator,[19] widely used e.g. for particle physics simulations. |
Maximally periodic reciprocals | 1992 | R. A. J. Matthews | [20] | A method with roots in number theory, although never used in practical applications. |
KISS | 1993 | G. Marsaglia | [21] | Prototypical example of a combination generator. |
Multiply-with-carry (MWC) | 1994 | G. Marsaglia; C. Koç | [22][23] | |
Complementary-multiply-with-carry (CMWC) | 1997 | R. Couture and P. L’Ecuyer | [24] | |
Mersenne Twister (MT) | 1998 | M. Matsumoto and T. Nishimura | [25] | Closely related with LFSRs. In its MT19937 implementation is probably the most commonly used modern PRNG. Default generator in R and the Python language starting from version 2.3. |
Xorshift | 2003 | G. Marsaglia | [26] | It is a very fast sub-type of LFSR generators. Marsaglia also suggested as an improvement the xorwow generator, in which the output of a xorshift generator is added with a Weyl sequence. The xorwow generator is the default generator in the CURAND library of the nVidia CUDA application programming interface for graphics processing units. |
Well equidistributed long-period linear (WELL) | 2006 | F. Panneton, P. L'Ecuyer and M. Matsumoto | [27] | A LFSR closely related with Mersenne Twister, aiming at remedying some of its shortcomings. |
A small noncryptographic PRNG (JSF) | 2007 | Bob Jenkins | [28] | |
Advanced Randomization System (ARS) | 2011 | J. Salmon, M. Moraes, R. Dror and D. Shaw | [29] | A simplified version of the AES block cipher, leading to very fast performance on systems supporting the AES-NI. |
Threefry | 2011 | J. Salmon, M. Moraes, R. Dror and D. Shaw | [29] | A simplified version of the Threefish block cipher, suitable for GPU implementations. |
Philox | 2011 | J. Salmon, M. Moraes, R. Dror and D. Shaw | [29] | A simplification and modification of the block cipher Threefish with the addition of an S-box. |
WELLDOC | 2013 | L. Balkova, M. Bucci, A. de Luca, J. Hladky, S. Puzynina | [30] | Aperiodic pseudorandom number generators based on infinite words technique. |
SplitMix | 2014 | G. L. Steele, D. Lea and C. H. Flood | [31] | Based upon the final mixing function of MurmurHash3. Included in Java Development Kit 8 and above. |
Permuted Congruential Generator (PCG) | 2014 | M. E. O'Neill | [32] | A modification of LCG. |
Random Cycle Bit Generator (RCB) | 2016 | R. Cookman | [33] | RCB is described as a bit pattern generator made to overcome some of the shortcomings with Mersenne Twister and short periods/bit length restriction of shift/modulo generators. |
Middle-Square Weyl Sequence RNG (see also middle-square method) | 2017 | B. Widynski | [34][35] | A variation on John von Neumann's original middle-square method, this generator may be the fastest RNG that passes all the statistical tests. |
Xoroshiro128+ | 2018 | D. Blackman, S. Vigna | [36] | A modification of Marsaglia's Xorshift generators, one of the fastest generators on modern 64-bit CPUs. Related generators include xoroshiro128**, xoshiro256+ and xoshiro256**. |
64-bit MELG (MELG-64) | 2018 | S. Harase, T. Kimoto | [37] | An implementation of 64-bit maximally equidistributed F2-linear generators with Mersenne prime period. |
Squares RNG | 2020 | B. Widynski | [38] | A counter-based version of Middle-Square Weyl Sequence RNG. Similar to Philox in design but significantly faster. |
Cryptographic algorithms
Cipher algorithms and cryptographic hashes can be used as very high-quality pseudorandom number generators. However, generally they are considerably slower (typically by a factor 2–10) than fast, non-cryptographic random number generators.
These include:
- Stream ciphers. Popular choices are Salsa20 or ChaCha (often with the number of rounds reduced to 8 for speed), ISAAC, HC-128 and RC4.
- Block ciphers in counter mode. Common choices are AES (which is very fast on systems supporting it in hardware), TwoFish, Serpent and Camellia.
- Cryptographic hash functions
A few cryptographically secure pseudorandom number generators do not rely on cipher algorithms but try to link mathematically the difficulty of distinguishing their output from a `true' random stream to a computationally difficult problem. These approaches are theoretically important but are too slow to be practical in most applications. They include:
- Blum–Micali algorithm (1984)
- Blum Blum Shub (1986)
- Naor–Reingold pseudorandom function (1997)
Random number generators that use external entropy
These approaches combine a pseudo-random number generator (often in the form of a block or stream cipher) with an external source of randomness (e.g., mouse movements, delay between keyboard presses etc.).
/dev/random
– Unix-like systems- CryptGenRandom – Microsoft Windows
- Fortuna
- RDRAND instructions (called Intel Secure Key by Intel), available in Intel x86 CPUs since 2012. They use the AES generator built into the CPU, reseeding it periodically.
- True Random Number Generator using Corona Discharge.[39]
- Yarrow
See also
- Diceware
- Diehard tests – statistical test suite for random number generators
- Non-uniform random variate generation
- Hardware random number generator
- Random number generator attack
- Randomness
- TestU01 – statistical test suite for random number generators
References
- ↑ Some of von Neumann's 1949 papers were printed only in 1951. John von Neumann, “Various techniques used in connection with random digits,” in A.S. Householder, G.E. Forsythe, and H.H. Germond, eds., Monte Carlo Method, National Bureau of Standards Applied Mathematics Series, vol. 12 (Washington, D.C.: U.S. Government Printing Office, 1951): pp. 36–38.
- ↑ Lehmer, Derrick H. (1951). "Mathematical methods in large-scale computing units". Proceedings of 2nd Symposium on Large-Scale Digital Calculating Machinery: 141–146.
- ↑ Thomson, W. E. (1958). "A Modified Congruence Method of Generating Pseudo-random Numbers". The Computer Journal 1 (2): 83. doi:10.1093/comjnl/1.2.83.
- ↑ Rotenberg, A. (1960). "A New Pseudo-Random Number Generator". Journal of the ACM 7 (1): 75–77. doi:10.1145/321008.321019.
- ↑ D. E. Knuth, The Art of Computer Programming, Vol. 2 Seminumerical Algorithms, 3rd ed., Addison Wesley Longman (1998); See pag. 27.
- ↑ Tausworthe, R. C. (1965). "Random Numbers Generated by Linear Recurrence Modulo Two". Mathematics of Computation 19 (90): 201–209. doi:10.1090/S0025-5718-1965-0184406-1. https://www.ams.org/journals/mcom/1965-19-090/S0025-5718-1965-0184406-1/S0025-5718-1965-0184406-1.pdf.
- ↑ Wichmann, Brian A.; Hill, David I. (1982). "Algorithm AS 183: An Efficient and Portable Pseudo-Random Number Generator". Journal of the Royal Statistical Society. Series C (Applied Statistics) 31 (2): 188–190. doi:10.2307/2347988.
- ↑ "Microsoft Support - Description of the RAND function in Excel". Apr 17, 2018. https://support.microsoft.com/en-us/help/828795/description-of-the-rand-function-in-excel.
- ↑ "Documentation » The Python Standard Library » 9. Numeric and Mathematical Modules » 9.6. random — Generate pseudo-random numbers". https://docs.python.org/2/library/random.html.
- ↑ Wolfram, S. (1983). "Statistical mechanics of cellular automata". Rev. Mod. Phys. 55 (3): 601–644. doi:10.1103/RevModPhys.55.601. Bibcode: 1983RvMP...55..601W.
- ↑ Eichenauer, Jürgen; Lehn, Jürgen (1986). "A nonlinear congruential pseudorandom number generator.". Statistische Hefte 27: 315–326. doi:10.1007/BF02932576.
- ↑ Blum, L.; Blum, M.; Shub, M. (1986-05-01). "A Simple Unpredictable Pseudo-Random Number Generator". SIAM Journal on Computing 15 (2): 364–383. doi:10.1137/0215025. ISSN 0097-5397. https://epubs.siam.org/doi/10.1137/0215025.
- ↑ Park, Stephen K.; Miller, Keith W. (1988). "Random Number Generators: Good Ones Are Hard To Find". Communications of the ACM 31 (10): 1192–1201. doi:10.1145/63039.63042. http://www.firstpr.com.au/dsp/rand31/p1192-park.pdf.
- ↑ "Pseudo-random number generation". https://en.cppreference.com/w/cpp/numeric/random.
- ↑ Wikramaratna, R. S. (1989). "ACORN — A new method for generating sequences of uniformly distributed Pseudo-random Numbers". Journal of Computational Physics 83 (1): 16–31. doi:10.1016/0021-9991(89)90221-0. Bibcode: 1989JCoPh..83...16W.
- ↑ Wikramaratna, R.S. Theoretical and empirical convergence results for additive congruential random number generators, Journal of Computational and Applied Mathematics (2009), doi:10.1016/j.cam.2009.10.015
- ↑ Savvidy, G.K; Ter-Arutyunyan-Savvidy, N.G (1991). "On the Monte Carlo simulation of physical systems". Journal of Computational Physics 97 (2): 566. doi:10.1016/0021-9991(91)90015-D. Bibcode: 1991JCoPh..97..566S.
- ↑ 18.0 18.1 George, Marsaglia; Zaman, Arif (1991). "A new class of random number generators". Annals of Applied Probability 1 (3): 462–480. doi:10.1214/aoap/1177005878. https://projecteuclid.org/download/pdf_1/euclid.aoap/1177005878.
- ↑ Martin, Lüscher (1994). "A portable high-quality random number generator for lattice field theory simulations". Computer Physics Communications 79 (1): 100–110. doi:10.1016/0010-4655(94)90232-1. Bibcode: 1994CoPhC..79..100L.
- ↑ Matthews, Robert A. J. (1992). "Maximally periodic reciprocals". Bull. Inst. Math. Appl. 28: 147–148. https://www.researchgate.net/publication/266728416.
- ↑ Marsaglia, George; Zaman, Arif (1993). "The KISS generator". Technical Report, Department of Statistics, Florida State University, Tallahassee, FL, USA.
- ↑ Post by George Marsaglia on the newsgroup sci.stat.math dated 1 August 2018 with title 'Yet another RNG'.
- ↑ Koç, Cemal (1995). "Recurring-with-Carry Sequences". Journal of Applied Probability 32 (4): 966–971. doi:10.2307/3215210.
- ↑ Couture, Raymond; L'Ecuyer, Pierre (1997). "Distribution properties of multiply-with-carry random number generators". Mathematics of Computation 66 Number. 218 (218): 591–607. doi:10.1090/S0025-5718-97-00827-2. Bibcode: 1997MaCom..66..591C. https://www.ams.org/journals/mcom/1997-66-218/S0025-5718-97-00827-2/S0025-5718-97-00827-2.pdf.
- ↑ Matsumoto, M.; Nishimura, T. (1998). "MersenneTwister: A623-dimensionally Equidistributed Uniform Pseudo-Random Number Generator". ACM Transactions on Modeling and Computer Simulation 8 (1): 3–30. doi:10.1145/272991.272995.
- ↑ "Xorshift RNGs". Journal of Statistical Software 8 (14). July 2003. doi:10.18637/jss.v008.i14.
- ↑ Panneton, François O.; l'Ecuyer, Pierre; Matsumoto, Pierre (March 2006). "Improved long-period generators based on linear recurrences modulo 2". ACM Transactions on Mathematical Software 32 (1): 1–16. doi:10.1145/1132973.1132974. http://www.iro.umontreal.ca/~lecuyer/myftp/papers/wellrng.pdf.
- ↑ Jenkins, Bob (2009). "A small noncryptographic PRNG". http://burtleburtle.net/bob/rand/smallprng.html.
- ↑ 29.0 29.1 29.2 Salmon, John; Moraes, Mark; Dror, Ron; Shaw, David (2011). "Parallel random numbers: as easy as 1, 2, 3". doi:10.1145/2063384.2063405.
- ↑ Balkova, Lubomira; Bucci, Michelangelo; De Luca, Alessandro; Hladky, Jiri; Puzynina, Svetlana (September 2016). "Aperiodic pseudorandom number generators based on infinite words". Theoretical Computer Science 647: 85–100. doi:10.1016/j.tcs.2016.07.042.
- ↑ Steele, Guy L. Jr.; Lea, Doug; Flood, Christine H. (2014). "Fast splittable pseudorandom number generators". OOPSLA '14 Proceedings of the 2014 ACM International Conference on Object Oriented Programming Systems Languages & Applications. http://gee.cs.oswego.edu/dl/papers/oopsla14.pdf.
- ↑ O'Neill, Melissa E. (2014). "PCG: A Family of Simple Fast Space-Efficient Statistically Good Algorithms for Random Number Generation". Technical Report. http://www.pcg-random.org/pdf/hmc-cs-2014-0905.pdf.
- ↑ Cookman, Richard (2016). "random cycle bit generator (rcb_generator)". Technical Report. https://github.com/ceorron/cycle-bit-random-number-generator.
- ↑ Widynski, Bernard (2017). "Middle-Square Weyl Sequence RNG". arXiv:1704.00358 [cs.CR].
- ↑ Kneusel, Ron (2018). Random Numbers and Computers (1 ed.). Springer. pp. 13–14. ISBN 9783319776972. https://books.google.com/books?id=7ZJUDwAAQBAJ.
- ↑ Blackman, David; Vigna, Sebastiano (2018). "Scrambled Linear Pseudorandom Generators". arXiv:1805.01407 [cs.DS].
- ↑ Harase, S.; Kimoto, T. (2018). "Implementing 64-bit Maximally Equidistributed F2-Linear Generators with Mersenne Prime Period". ACM Transactions on Mathematical Software 44 (3): 30:1–30:11. doi:10.1145/3159444. https://github.com/sharase/melg-64.
- ↑ Widynski, Bernard (2020). "Squares: A Fast Counter-Based RNG". arXiv:2004.06278 [cs.DS].
- ↑ True Random Number Generator using Corona Discharge: Indian Patent Office. Patent Application Number: 201821026766
External links
- SP800-90 series on Random Number Generation, NIST
- Random Number Generation in the GNU Scientific Library Reference Manual
- Random Number Generation Routines in the NAG Numerical Library
- Chris Lomont's overview of PRNGs, including a good implementation of the WELL512 algorithm
- Source code to read data from a TrueRNG V2 hardware TRNG
![]() | Original source: https://en.wikipedia.org/wiki/List of random number generators.
Read more |