# Simple Random Simple pseudo-random number generators. ## Intro This project provides `simplerandom`, simple pseudo-random number generators. Features: * Main API functions: * Seed * Generate "next" random value * "Jump-ahead" (also known as "discard" in C++) to skip the generator ahead by 'n' samples. * Simple algorithms that are easily ported to different languages. * Safe seeding. Many generators have some "bad" state values that must be avoided. The seed functions for all generators ensure that any "bad" state values are avoided, and replaced by a suitable alternative initial state. * These random number generators have been implemented in the following languages: * C * Python * Rust * Same numeric output in each supported language. It can be useful to be able to implement the identical algorithm on muliple platforms and/or languages. * Simple algorithms and state size appropriate for limited RAM and ROM (e.g. in embedded systems). * Decent cross-platform support. * Various OS. * Various processors, 8- to 64-bit. * Implement target language's API idioms and/or existing random number generator API. * Reasonable statistical properties of pseudo-random output (though not for all generators provided). ## Algorithms Most algorithms were obtained from two newsgroup posts by George Marsaglia [[mars1]](#mars1) [[mars2]](#mars2). However, some modifications have been made. From [[rose1]](#rose1), it seems that the SHR3 algorithm defined in [[mars1]](#mars1) is flawed and should not be used. It doesn't actually have a period of 232-1 as expected, but has 64 different cycles, some with very short periods. The SHR3 in the 2003 post is very similar, but with two shift values swapped. It has a period of 232-1 as expected. We still find KISS from [[mars1]](#mars1) useful mainly because it uses 32-bit calculations for MWC, which can be more suitable for small embedded systems. So we define KISS that uses a MWC based on [[mars1]](#mars1), but the Cong and SHR3 from [[mars2]](#mars2). From Pierre L'Ecuyer [[lecuyer1]](#lecuyer1) [[lecuyer2]](#lecuyer2), the Combined LFSR (Tausworthe) LFSR113 algorithm [[lecuyer3]](#lecuyer3) and LFSR88 (aka Taus88) have been implemented. ### Random Number Generators Provided The following pseudo-random number generators are provided: | Generator | Notes | ----------- | -------------------------------------------------------------------------------------------------------------- | `MWC1` | Two 32-bit MWCs combined. From [[mars1]](#mars1). | `MWC2` | Very similar to `MWC1`, but slightly modified to improve its statistical properties. | `Cong` | From [[mars2]](#mars2). | `SHR3` | From [[mars2]](#mars2). | `MWC64` | A single 64-bit multiply-with-carry calculation. From [[mars2]](#mars2). | `KISS` | Combination of MWC2, Cong and SHR3. Based on [[mars1]](#mars1) but using Cong and SHR3 from [[mars2]](#mars2), and the modified MWC. | `KISS2` | Combination of MWC64, Cong and SHR3. From [[mars2]](#mars2). | `LFSR113` | Combined LFSR (Tausworthe) random number generator by L'Ecuyer. From [[lecuyer1]](#lecuyer1) [[lecuyer3]](#lecuyer3). | `LFSR88` | Combined LFSR (Tausworthe) random number generator by L'Ecuyer. From [[lecuyer2]](#lecuyer2). ## License The code is released under the MIT license. See LICENSE.txt for details. ## References \[mars1\] [Random Numbers for C: End, at last?](http://www.cse.yorku.ca/~oz/marsaglia-rng.html) George Marsaglia Newsgroup post, sci.stat.math and others, Thu, 21 Jan 1999 \[mars2\] [RNGs](http://groups.google.com/group/sci.math/msg/9959175f66dd138f) George Marsaglia Newsgroup post, sci.math, 26 Feb 2003 \[rose1\] [KISS: A Bit Too Simple](http://eprint.iacr.org/2011/007.pdf) Greg Rose Qualcomm Inc. \[lecuyer1\] [Tables of Maximally-Equidistributed Combined LFSR Generators](http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.43.3639) Pierre L'Ecuyer Mathematics of Computation, 68, 225 (1999), 261–269. \[lecuyer2\] [Maximally Equidistributed Combined Tausworthe Generators](http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.43.4155) P. L'Ecuyer Mathematics of Computation, 65, 213 (1996), 203–213. \[lecuyer3\] [LFSR113 C double implementation](http://www.iro.umontreal.ca/~simardr/rng/lfsr113.c) Pierre L'Ecuyer