Linear congruential generator

Two modulo-9 LCGs show how different parameters lead to different cycle lengths. Each row shows the state evolving until it repeats. The top row shows a generator with m = 9, a = 2, c = 0, and a seed of 1, which produces a cycle of length 6. The second row is the same generator with a seed of 3, which produces a cycle of length 2. Using a = 4 and c = 1 (bottom row) gives a cycle length of 9 with any seed in [0, 8].

A linear congruential generator (LCG) is an algorithm that yields a sequence of pseudo-randomized numbers calculated with a discontinuous piecewise linear equation. The method represents one of the oldest and best-known pseudorandom number generator algorithms. The theory behind them is relatively easy to understand, and they are easily implemented and fast, especially on computer hardware which can provide modular arithmetic by storage-bit truncation.

The generator is defined by the recurrence relation:

where is the sequence of pseudo-random values, and

— the "modulus"
— the "multiplier"
— the "increment"
— the "seed" or "start value"

are integer constants that specify the generator. If c = 0, the generator is often called a multiplicative congruential generator (MCG), or Lehmer RNG. If c ≠ 0, the method is called a mixed congruential generator.[1]: 4- 

When c ≠ 0, a mathematician would call the recurrence an affine transformation, not a linear one, but the misnomer is well-established in computer science.[2]: 1 

History

The Lehmer generator was published in 1951[3] and the Linear congruential generator was published in 1958 by W. E. Thomson and A. Rotenberg.[4][5]

Period length

A benefit of LCGs is that an appropriate choice of parameters results in a period which is both known and long. Although not the only criterion, too short a period is a fatal flaw in a pseudorandom number generator.[6]

While LCGs are capable of producing pseudorandom numbers which can pass formal tests for randomness, the quality of the output is extremely sensitive to the choice of the parameters m and a.[1][2][7][8][9][10] For example, a = 1 and c = 1 produces a simple modulo-m counter, which has a long period, but is obviously non-random. Other values of c coprime to m produce a Weyl sequence, which is better distributed but still obviously non-random.

Historically, poor choices for a have led to ineffective implementations of LCGs. A particularly illustrative example of this is RANDU, which was widely used in the early 1970s and led to many results which are currently being questioned because of the use of this poor LCG.[11][8]: 1198–9 

There are three common families of parameter choice:

m prime, c = 0

This is the original Lehmer RNG construction. The period is m−1 if the multiplier a is chosen to be a primitive element of the integers modulo m. The initial state must be chosen between 1 and m−1.

One disadvantage of a prime modulus is that the modular reduction requires a double-width product and an explicit reduction step. Often a prime just less than a power of 2 is used (the Mersenne primes 231−1 and 261−1 are popular), so that the reduction modulo m = 2e − d can be computed as (ax mod 2e) + d ax/2e. This must be followed by a conditional subtraction of m if the result is too large, but the number of subtractions is limited to ad/m, which can be easily limited to one if d is small.

If a double-width product is unavailable, and the multiplier is chosen carefully, Schrage's method[12] may be used. To do this, factor m = qa+r, i.e. q = m/a and r = m mod a. Then compute ax mod m = a(x mod q) − rx/q. Since x mod q < qm/a, the first term is strictly less than am/a = m. If a is chosen so that r ≤ q (and thus r/q ≤ 1), then the second term is also less than m: rx/qrx/q = x(r/q) ≤ x < m. Thus, both products can be computed with a single-width product, and the difference between them lies in the range [1−mm−1], so can be reduced to [0, m−1] with a single conditional add.[13]

A second disadvantage is that it is awkward to convert the value 1 ≤ x < m to uniform random bits. If a prime just less than a power of 2 is used, sometimes the missing values are simply ignored.

m a power of 2, c = 0

Choosing m to be a power of two, most often m = 232 or m = 264, produces a particularly efficient LCG, because this allows the modulus operation to be computed by simply truncating the binary representation. In fact, the most significant bits are usually not computed at all. There are, however, disadvantages.

This form has maximal period m/4, achieved if a ≡ ±3 (mod 8) and the initial state X0 is odd. Even in this best case, the low three bits of X alternate between two values and thus only contribute one bit to the state. X is always odd (the lowest-order bit never changes), and only one of the next two bits ever changes. If a ≡ +3, X alternates ±1↔±3, while if a ≡ −3, X alternates ±1↔∓3 (all modulo 8).

It can be shown that this form is equivalent to a generator with modulus m/4 and c ≠ 0.[1]

A more serious issue with the use of a power-of-two modulus is that the low bits have a shorter period than the high bits. Its simplicity of implementation comes from the fact that bits are never affected by higher-order bits, so the low b bits of such a generator form a modulo-2b LCG by themselves, repeating with a period of 2b−2. Only the most significant bit of X achieves the full period.

m a power of 2, c ≠ 0

When c ≠ 0, correctly chosen parameters allow a period equal to m, for all seed values. This will occur if and only if:[1]: 17–19 

  1. and are coprime,
  2. is divisible by all prime factors of ,
  3. is divisible by 4 if is divisible by 4.

These three requirements are referred to as the Hull–Dobell Theorem.[14][15]

This form may be used with any m, but only works well for m with many repeated prime factors, such as a power of 2; using a computer's word size is the most common choice. If m were a square-free integer, this would only allow a ≡ 1 (mod m), which makes a very poor PRNG; a selection of possible full-period multipliers is only available when m has repeated prime factors.

Although the Hull–Dobell theorem provides maximum period, it is not sufficient to guarantee a good generator.[8]: 1199  For example, it is desirable for a − 1 to not be any more divisible by prime factors of m than necessary. If m is a power of 2, then a − 1 should be divisible by 4 but not divisible by 8, i.e. a ≡ 5 (mod 8).[1]: §3.2.1.3 

Indeed, most multipliers produce a sequence which fails one test for non-randomness or another, and finding a multiplier which is satisfactory to all applicable criteria[1]: §3.3.3  is quite challenging.[8] The spectral test is one of the most important tests.[16]

Note that a power-of-2 modulus shares the problem as described above for c = 0: the low k bits form a generator with modulus 2k and thus repeat with a period of 2k; only the most significant bit achieves the full period. If a pseudorandom number less than r is desired, rX/m is a much higher-quality result than X mod r. Unfortunately, most programming languages make the latter much easier to write (X % r), so it is very commonly used.

The generator is not sensitive to the choice of c, as long as it is relatively prime to the modulus (e.g. if m is a power of 2, then c must be odd), so the value c=1 is commonly chosen.

The sequence produced by other choices of c can be written as a simple function of the sequence when c=1.[1]: 11  Specifically, if Y is the prototypical sequence defined by Y0 = 0 and Yn+1aYn + 1 mod m, then a general sequence Xn+1aXn + c mod m can be written as an affine function of Y:

More generally, any two sequences X and Z with the same multiplier and modulus are related by

In the common case where m is a power of 2 and a ≡ 5 (mod 8) (a desirable property for other reasons), it is always possible to find an initial value X0 so that the denominator X1 − X0 ≡ ±1 (mod m), producing an even simpler relationship. With this choice of X0, XnX0 ± Yn will remain true for all n.[2]: 10-11  The sign is determined by c ≡ ±1 (mod 4), and the constant X0 is determined by 1 ∓ c ≡ (1 − a)X0 (mod m).

As a simple example, consider the generators Xn+1 = 157Xn + 3 mod 256 and Yn+1 = 157Yn + 1 mod 256; i.e. m = 256, a = 157, and c = 3. Because 3 ≡ −1 (mod 4), we are searching for a solution to 1 + 3 ≡ (1 − 157)X0 (mod 256). This is satisfied by X0 ≡ 41 (mod 64), so if we start with that, then Xn ≡ X0 − Yn (mod 256) for all n.

For example, using X0 = 233 = 3×64 + 41:

  • X = 233, 232, 75, 2, 61, 108, ...
  • Y = 0, 1, 158, 231, 172, 125, ...
  • X + Y mod 256 = 233, 233, 233, 233, 233, 233, ...

Parameters in common use

The following table lists the parameters of LCGs in common use, including built-in rand() functions in runtime libraries of various compilers. This table is to show popularity, not examples to emulate; many of these parameters are poor. Tables of good parameters are available.[10][2]

Source modulus
m
multiplier
a
increment
c
output bits of seed in rand() or Random(L)
ZX81 216 + 1 75 74
Numerical Recipes ranqd1, Chapter 7.1, §An Even Quicker Generator, Eq. 7.1.6
parameters from Knuth and H. W. Lewis
232 1664525 1013904223
Borland C/C++ 231 22695477 1 bits 30..16 in rand(), 30..0 in lrand()
glibc (used by GCC)[17] 231 1103515245 12345 bits 30..0
ANSI C: Watcom, Digital Mars, CodeWarrior, IBM VisualAge C/C++[18]
C90, C99, C11: Suggestion in the ISO/IEC 9899,[19] C17
231 1103515245 12345 bits 30..16
Borland Delphi, Virtual Pascal 232 134775813 1 bits 63..32 of (seed × L)
Turbo Pascal 4.0 et seq.[20] 232 134775813 (808840516) 1
Microsoft Visual/Quick C/C++ 231 214013 (343FD16) 2531011 (269EC316) bits 30..16
Microsoft Visual Basic (6 and earlier)[21] 224 16598013 (FD43FD16) 12820163 (C39EC316)
RtlUniform from Native API[22][23] 231 − 1 −18 (7FFFFFED16) −60 (7FFFFFC316)
Apple CarbonLib, C++11's minstd_rand0,[24] MATLAB's v4 legacy generator mcg16807[25] 231 − 1 16807 0 see MINSTD
C++11's minstd_rand[24] 231 − 1 48271 0 see MINSTD
MMIX by Donald Knuth 264 6364136223846793005 1442695040888963407
Newlib[26] 263 6364136223846793005 1 bits 62..32 (46..32 for 16-bit int)
Musl 264 6364136223846793005 1 bits 63..33
VMS's MTH$RANDOM,[27] old versions of glibc 232 69069 (10DCD16) 1
Java's java.util.Random, POSIX [ln]rand48, glibc [ln]rand48[_r] 248 25214903917 (5DEECE66D16) 11 bits 47..16

random0[28][29][30][31][32]

134456 = 2375 8121 28411
POSIX[33] [dejm]rand48, glibc [dejm]rand48[_r] 248 25214903917 (5DEECE66D16) 11 bits 47..0 or bits 47..15, as required
cc65[34] 223 65793 (1010116) 4282663 (41592716) bits 22..8
cc65 232 16843009 (101010116) 826366247 (3141592716) bits 31..16
cc65 232 16843009 (101010116) 3014898611 (B3B3B3B316) previously bits 31..16, current bits 31..16 xor bits 14..0
Formerly common: RANDU[11] 231 65539 0

As shown above, LCGs do not always use all of the bits in the values they produce. In general, they return the most significant bits. For example, the Java implementation operates with 48-bit values at each iteration but returns only their 32 most significant bits. This is because the higher-order bits have longer periods than the lower-order bits (see below). LCGs that use this truncation technique produce statistically better values than those that do not. This is especially noticeable in scripts that use the mod operation to reduce range; modifying the random number mod 2 will lead to alternating 0 and 1 without truncation.

Contrarily, some libraries use an implicit power-of-two modulus but never output or otherwise use the most significant bit, in order to limit the output to positive two's complement integers. The output is as if the modulus were one bit less than the internal word size, and such generators are described as such in the table above.

Advantages and disadvantages

LCGs are fast and require minimal memory (one modulo-m number, often 32 or 64 bits) to retain state. This makes them valuable for simulating multiple independent streams. LCGs are not intended, and must not be used, for cryptographic applications; use a cryptographically secure pseudorandom number generator for such applications.

Hyperplanes of a linear congruential generator in three dimensions. This structure is what the spectral test measures.

Although LCGs have a few specific weaknesses, many of their flaws come from having too small a state. The fact that people have been lulled for so many years into using them with such small moduli can be seen as a testament to the strength of the technique. A LCG with large enough state can pass even stringent statistical tests; a modulo-264 LCG which returns the high 32 bits passes TestU01's SmallCrush suite,[citation needed] and a 96-bit LCG passes the most stringent BigCrush suite.[35]

For a specific example, an ideal random number generator with 32 bits of output is expected (by the Birthday theorem) to begin duplicating earlier outputs after m ≈ 216 results. Any PRNG whose output is its full, untruncated state will not produce duplicates until its full period elapses, an easily detectable statistical flaw.[36] For related reasons, any PRNG should have a period longer than the square of the number of outputs required. Given modern computer speeds, this means a period of 264 for all but the least demanding applications, and longer for demanding simulations.

One flaw specific to LCGs is that, if used to choose points in an n-dimensional space, the points will lie on, at most, nn!⋅m hyperplanes (Marsaglia's theorem, developed by George Marsaglia).[7] This is due to serial correlation between successive values of the sequence Xn. Carelessly chosen multipliers will usually have far fewer, widely spaced planes, which can lead to problems. The spectral test, which is a simple test of an LCG's quality, measures this spacing and allows a good multiplier to be chosen.

The plane spacing depends both on the modulus and the multiplier. A large enough modulus can reduce this distance below the resolution of double precision numbers. The choice of the multiplier becomes less important when the modulus is large. It is still necessary to calculate the spectral index and make sure that the multiplier is not a bad one, but purely probabilistically it becomes extremely unlikely to encounter a bad multiplier when the modulus is larger than about 264.

Another flaw specific to LCGs is the short period of the low-order bits when m is chosen to be a power of 2. This can be mitigated by using a modulus larger than the required output, and using the most significant bits of the state.

Nevertheless, for some applications LCGs may be a good option. For instance, in an embedded system, the amount of memory available is often severely limited. Similarly, in an environment such as a video game console taking a small number of high-order bits of an LCG may well suffice. (The low-order bits of LCGs when m is a power of 2 should never be relied on for any degree of randomness whatsoever.) The low order bits go through very short cycles. In particular, any full-cycle LCG, when m is a power of 2, will produce alternately odd and even results.

LCGs should be evaluated very carefully for suitability in non-cryptographic applications where high-quality randomness is critical. For Monte Carlo simulations, an LCG must use a modulus greater and preferably much greater than the cube of the number of random samples which are required. This means, for example, that a (good) 32-bit LCG can be used to obtain about a thousand random numbers; a 64-bit LCG is good for about 221 random samples (a little over two million), etc. For this reason, in practice LCGs are not suitable for large-scale Monte Carlo simulations.

Sample code

Python code

The following is an implementation of an LCG in Python, in the form of a generator:

from collections.abc import Generator

def lcg(modulus: int, a: int, c: int, seed: int) -> Generator[int, None, None]:
    """Linear congruential generator."""
    while True:
        seed = (a * seed + c) % modulus
        yield seed

Haskell code

The following is an implementation of an LCG in Haskell utilizing a lazy evaluation strategy to generate an infinite stream of output values in a list:

-- Allowing a generic choice for a, c, m and x_0
linearCongruentialGenerator :: Integer -> Integer -> Integer -> Integer -> [Integer]
linearCongruentialGenerator a c modulus seed = lcgacmx0
  where lcgacmx0 = seed : map (\x -> (a*x + c) % modulus) lcgacmx0

-- Specific parameters can be easily specified (eg. Knuth's MMIX parameters):
mmixLCG :: Integer -> [Integer]
mmixLCG = linearCongruentialGenerator 6364136223846793005 1442695040888963407 (2^(64 ::Integer))

Free Pascal

Free Pascal uses a Mersenne Twister as its default pseudo random number generator whereas Delphi uses a LCG. Here is a Delphi compatible example in Free Pascal based on the information in the table above. Given the same RandSeed value it generates the same sequence of random numbers as Delphi.

unit lcg_random;
{$ifdef fpc}{$mode delphi}{$endif}
interface

function LCGRandom: extended; overload; inline;
function LCGRandom(const range:longint): longint; overload; inline;

implementation
function IM: cardinal; inline;
begin
  RandSeed := RandSeed * 134775813 + 1;
  Result := RandSeed;
end;

function LCGRandom: extended; overload; inline;
begin
  Result := IM * 2.32830643653870e-10;
end;

function LCGRandom(const range: longint): longint; overload; inline;
begin
  Result := IM * range shr 32;
end;

Like all pseudorandom number generators, a LCG needs to store state and alter it each time it generates a new number. Multiple threads may access this state simultaneously causing a race condition. Implementations should use different state each with unique initialization for different threads to avoid equal sequences of random numbers on simultaneously executing threads.

LCG derivatives

There are several generators which are linear congruential generators in a different form, and thus the techniques used to analyze LCGs can be applied to them.

One method of producing a longer period is to sum the outputs of several LCGs of different periods having a large least common multiple; the Wichmann–Hill generator is an example of this form. (We would prefer them to be completely coprime, but a prime modulus implies an even period, so there must be a common factor of 2, at least.) This can be shown to be equivalent to a single LCG with a modulus equal to the product of the component LCG moduli.

Marsaglia's add-with-carry and subtract-with-borrow PRNGs with a word size of b=2w and lags r and s (r > s) are equivalent to LCGs with a modulus of br ± bs ± 1.[37][38]

Multiply-with-carry PRNGs with a multiplier of a are equivalent to LCGs with a large prime modulus of abr−1 and a power-of-2 multiplier b.

A permuted congruential generator begins with a power-of-2-modulus LCG and applies an output transformation to eliminate the short period problem in the low-order bits.

Comparison with other PRNGs

The other widely used primitive for obtaining long-period pseudorandom sequences is the linear-feedback shift register construction, which is based on arithmetic in GF(2)[x], the polynomial ring over GF(2). Rather than integer addition and multiplication, the basic operations are exclusive-or and carry-less multiplication, which is usually implemented as a sequence of logical shifts. These have the advantage that all of their bits are full-period; they do not suffer from the weakness in the low-order bits that plagues arithmetic modulo 2k.[39]

Examples of this family include xorshift generators and the Mersenne twister. The latter provides a very long period (219937−1) and variate uniformity, but it fails some statistical tests.[40] Lagged Fibonacci generators also fall into this category; although they use arithmetic addition, their period is ensured by an LFSR among the least-significant bits.

It is easy to detect the structure of a linear-feedback shift register with appropriate tests[41] such as the linear complexity test implemented in the TestU01 suite; a Boolean circulant matrix initialized from consecutive bits of an LFSR will never have rank greater than the degree of the polynomial. Adding a non-linear output mixing function (as in the xoshiro256** and permuted congruential generator constructions) can greatly improve the performance on statistical tests.

Another structure for a PRNG is a very simple recurrence function combined with a powerful output mixing function. This includes counter mode block ciphers and non-cryptographic generators such as SplitMix64.

A structure similar to LCGs, but not equivalent, is the multiple-recursive generator: Xn = (a1Xn−1 + a2Xn−2 + ··· + akXnk) mod m for k ≥ 2. With a prime modulus, this can generate periods up to mk−1, so is a useful extension of the LCG structure to larger periods.

A powerful technique for generating high-quality pseudorandom numbers is to combine two or more PRNGs of different structure; the sum of an LFSR and an LCG (as in the KISS or xorwow constructions) can do very well at some cost in speed.

See also

Notes

  1. ^ a b c d e f g Knuth, Donald (1997). Seminumerical Algorithms. The Art of Computer Programming. Vol. 2 (3rd ed.). Reading, MA: Addison-Wesley Professional. pp. 10–26.
  2. ^ a b c d Steele, Guy L. Jr.; Vigna, Sebastiano (February 2022) [15 January 2020]. "Computationally easy, spectrally good multipliers for congruential pseudorandom number generators". Software: Practice and Experience. 52 (2): 443–458. arXiv:2001.05304. doi:10.1002/spe.3030. hdl:2434/891395. these denominations, by now used for half a century, are completely wrong from a mathematical viewpoint.... At this point it is unlikely that the now-traditional names will be corrected. Associated software and data at https://github.com/vigna/CPRNG.
  3. ^ Lehmer, Derrick H. (1951). "Mathematical methods in large-scale computing units". Proceedings of 2nd Symposium on Large-Scale Digital Calculating Machinery: 141–146.
  4. ^ 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.
  5. ^ Rotenberg, A. (1960). "A New Pseudo-Random Number Generator". Journal of the ACM. 7 (1): 75–77. doi:10.1145/321008.321019. S2CID 16770825.
  6. ^ L'Ecuyer, Pierre (13 July 2017). Chan, W. K. V.; D'Ambrogio, A.; Zacharewicz, G.; Mustafee, N.; Wainer, G.; Page, E. (eds.). History of Uniform Random Number Generation (PDF). Proceedings of the 2017 Winter Simulation Conference (to appear). Las Vegas, United States. hal-01561551.
  7. ^ a b Marsaglia, George (September 1968). "Random Numbers Fall Mainly in the Planes" (PDF). PNAS. 61 (1): 25–28. Bibcode:1968PNAS...61...25M. doi:10.1073/pnas.61.1.25. PMC 285899. PMID 16591687.
  8. ^ a b c d Park, Stephen K.; Miller, Keith W. (October 1988). "Random Number Generators: Good Ones Are Hard To Find" (PDF). Communications of the ACM. 31 (10): 1192–1201. doi:10.1145/63039.63042. S2CID 207575300. In a sense it is unfortunate that this test for full period is so trivial as it falsely encourages non-specialists to build their own generators.
  9. ^ Hörmann, Wolfgang; Derflinger, Gerhard (1993). "A Portable Uniform Random Number Generator Well Suited for the Rejection Method" (PDF). ACM Transactions on Mathematical Software. 19 (4): 489–495. CiteSeerX 10.1.1.52.3811. doi:10.1145/168173.168414. S2CID 15238956. a multiplier about as small as m, produces random numbers with a bad one-dimensional distribution.
  10. ^ a b L'Ecuyer, Pierre (January 1999). "Tables of Linear Congruential Generators of Different Sizes and Good Lattice Structure" (PDF). Mathematics of Computation. 68 (225): 249–260. Bibcode:1999MaCom..68..249L. CiteSeerX 10.1.1.34.1024. doi:10.1090/S0025-5718-99-00996-5. Be sure to read the Errata as well.
  11. ^ a b Press, William H.; et al. (1992). Numerical Recipes in Fortran 77: The Art of Scientific Computing (2nd ed.). p. 268. ISBN 978-0-521-43064-7.
  12. ^ Jain, Raj (9 July 2010). "Computer Systems Performance Analysis Chapter 26: Random-Number Generation" (PDF). pp. 19–20. Retrieved 2017-10-31.
  13. ^ Fenerty, Paul (11 September 2006). "Schrage's Method". Retrieved 2017-10-31.
  14. ^ Hull, T. E.; Dobell, A. R. (July 1962). "Random Number Generators" (PDF). SIAM Review. 4 (3): 230–254. Bibcode:1962SIAMR...4..230H. doi:10.1137/1004061. hdl:1828/3142. Retrieved 2016-06-26.
  15. ^ Severance, Frank (2001). System Modeling and Simulation. John Wiley & Sons, Ltd. p. 86. ISBN 978-0-471-49694-6.
  16. ^ Austin, David (March 2008). "Random Numbers: Nothing Left to Chance". Feature Column. American Mathematical Society.
  17. ^ Implementation in glibc-2.26 release. See the code after the test for "TYPE_0"; the GNU C library's rand() in stdlib.h uses a simple (single state) linear congruential generator only in case that the state is declared as 8 bytes. If the state is larger (an array), the generator becomes an additive feedback generator (initialized using minstd_rand0) and the period increases. See the simplified code that reproduces the random sequence from this library.
  18. ^ K. Entacher (21 August 1997). A collection of selected pseudorandom number generators with linear structures. CiteSeerX 10.1.1.53.3686. Retrieved 16 June 2012.
  19. ^ "Last public Committee Draft from April 12, 2011" (PDF). p. 346f. Retrieved 21 Dec 2014.
  20. ^ Dohmann, Birgit; Falk, Michael; Lessenich, Karin (August 1991). "The random number generators of the Turbo Pascal family". Computational Statistics & Data Analysis. 12 (1): 129–132. doi:10.1016/0167-9473(91)90108-E.
  21. ^ "How Visual Basic Generates Pseudo-Random Numbers for the RND Function". Microsoft. 24 June 2004. Archived from the original on 17 April 2011. Retrieved 17 June 2011.
  22. ^ In spite of documentation on MSDN, RtlUniform uses LCG, and not Lehmer's algorithm, implementations before Windows Vista are flawed, because the result of multiplication is cut to 32 bits, before modulo is applied
  23. ^ "WINE source identifier search: RtlUniform". Retrieved 2024-01-13.
  24. ^ a b "ISO/IEC 14882:2011". ISO. 2 September 2011. Retrieved 3 September 2011.
  25. ^ "Creating and Controlling a Random Number Stream". MathWorks. Retrieved 7 June 2021.
  26. ^ "rand, srand—pseudo-random numbers". Newlib git repository. Retrieved 2024-01-13.
  27. ^ "GNU Scientific Library: gsl_rng_vax".
  28. ^ Stephen J. Chapman. "Example 6.4 – Random Number Generator". "MATLAB Programming for Engineers". 2015. pp. 253–256.
  29. ^ Stephen J. Chapman. "Example 6.4 – Random Number Generator". "MATLAB Programming with Applications for Engineers". 2012. pp. 292–295.
  30. ^ S. J. Chapman. random0. 2004.
  31. ^ Stephen J. Chapman. "Introduction to Fortran 90/95". 1998. pp. 322–324.
  32. ^ Wu-ting Tsai. "'Module': A Major Feature of the Modern Fortran" Archived 2021-02-24 at the Wayback Machine. pp. 6–7.
  33. ^ The Open Group Base Specifications Issue 7 IEEE Std 1003.1, 2013 Edition
  34. ^ Cadot, Sidney. "rand.s". cc65. Retrieved 8 July 2016.
  35. ^ O'Neill, Melissa E. (5 September 2014). PCG: A Family of Simple Fast Space-Efficient Statistically Good Algorithms for Random Number Generation (PDF) (Technical report). Harvey Mudd College. pp. 6–7. HMC-CS-2014-0905.
  36. ^ Heath, David; Sanchez, Paul (June 1986). "On the adequacy of pseudo-random number generators (or: How big a period do we need?)". Operations Research Letters. 5 (1): 3–6. doi:10.1016/0167-6377(86)90092-1.
  37. ^ Tezuka, Shu; L'Ecuyer, Pierre (October 1993). On the Lattice Structure of the Add-with-Carry and Subtract-with-Borrow Random Number Generators (PDF). Workshop on Stochastic Numerics. Kyoto University.
  38. ^ Tezuka, Shi; L'Ecuyer, Pierre (December 1992). Analysis of Add-with-Carry and Subtract-with-Borrow Generators (PDF). Proceedings of the 1992 Winter Simulation Conference. pp. 443–447.
  39. ^ Gershenfeld, Neil (1999). "Section 5.3.2: Linear Feedback". The Nature of Mathematical Modeling (First ed.). Cambridge University Press. p. 59. ISBN 978-0-521-57095-4.
  40. ^ Matsumoto, Makoto; Nishimura, Takuji (January 1998). "Mersenne twister: a 623-dimensionally equidistributed uniform pseudo-random number generator" (PDF). ACM Transactions on Modeling and Computer Simulation. 8 (1): 3–30. CiteSeerX 10.1.1.215.1141. doi:10.1145/272991.272995. S2CID 3332028. Archived from the original (PDF) on 2017-11-07.
  41. ^ Eastlake, Donald E. 3rd; Schiller, Jeffrey I.; Crocker, Steve (June 2005). "Traditional Pseudo-random Sequences". Randomness Requirements for Security. IETF. sec. 6.1.3. doi:10.17487/RFC4086. BCP 106. RFC 4086.

References

Read other articles:

Filosofi KopiPoster filmSutradaraAngga Dwimas SasongkoProduser Anggia Kharisma Handoko Hendroyono Glenn Fredly (ko-produser) SkenarioJenny JusufCeritaAngga Dwimas SasongkoM. Irfan RamliJenny JusufBerdasarkanFilosofi Kopioleh Dewi LestariPemeran Chicco Jerikho Rio Dewanto Julie Estelle Jajang C. Noer Slamet Rahardjo Otig Pakis Penata musikGlenn FredlySinematograferRobie TaswinPenyuntingAhsan AndrianPerusahaanproduksiVisinema PicturesDistributor Visinema Pictures Netflix Tanggal rilis9 Ap...

 

 

Ban on discussion of slavery in US House In United States history, the gag rule was a series of rules that forbade the raising, consideration, or discussion of slavery in the U.S. House of Representatives from 1836 to 1844. They played a key role in rousing support for ending slavery.[1]: 274  Background Congress regularly received petitions asking for various types of relief or action. Before the gag rules, House rules required that the first thirty days of each sessi...

 

 

追晉陸軍二級上將趙家驤將軍个人资料出生1910年 大清河南省衛輝府汲縣逝世1958年8月23日(1958歲—08—23)(47—48歲) † 中華民國福建省金門縣国籍 中華民國政党 中國國民黨获奖 青天白日勳章(追贈)军事背景效忠 中華民國服役 國民革命軍 中華民國陸軍服役时间1924年-1958年军衔 二級上將 (追晉)部队四十七師指挥東北剿匪總司令部參謀長陸軍�...

New World prehistoric projectile Clovis point, 11500–9000 BC, Sevier County, Utah, chert Clovis points are the characteristically fluted projectile points associated with the New World Clovis culture, a prehistoric Paleo-American culture. They are present in dense concentrations across much of North America and they are largely restricted to the north of South America. There are slight differences in points found in the Eastern United States bringing them to sometimes be called Clovis-like....

 

 

Bahasa Yunani Puglia Γκραίκο · Γκρίκο Dituturkan diItaliaWilayahPugliaEtnisSuku GrikoPenutur(20.000 jiwa per 1981)[1]40.000 hingga 50,000 sebagai L2 Rumpun bahasaIndo-Eropa HelenikYunaniYunani Attika–Ionia (diperdebatkan) Doria (diperdebatkan)Yunani ItaliaYunani Puglia Sistem penulisanAlfabet Yunani, Alfabet LatinStatus resmiDiakui sebagaibahasa minoritas di Italia PugliaKode bahasaISO 639-3–Glottologapul1237  (Apulian Greek)[2]Lingua...

 

 

This article needs additional citations for verification. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed.Find sources: St. Paul's Cathedral Fond du Lac, Wisconsin – news · newspapers · books · scholar · JSTOR (June 2019) (Learn how and when to remove this message) St. Paul's Cathedral in 2013 St. Paul's Cathedral is the mother church of the Episcopal Diocese of Fond du Lac...

2016年美國總統選舉 ← 2012 2016年11月8日 2020 → 538個選舉人團席位獲勝需270票民意調查投票率55.7%[1][2] ▲ 0.8 %   获提名人 唐納·川普 希拉莉·克林頓 政党 共和黨 民主党 家鄉州 紐約州 紐約州 竞选搭档 迈克·彭斯 蒂姆·凱恩 选举人票 304[3][4][註 1] 227[5] 胜出州/省 30 + 緬-2 20 + DC 民選得票 62,984,828[6] 65,853,514[6]...

 

 

此条目序言章节没有充分总结全文内容要点。 (2019年3月21日)请考虑扩充序言,清晰概述条目所有重點。请在条目的讨论页讨论此问题。 哈萨克斯坦總統哈薩克總統旗現任Қасым-Жомарт Кемелұлы Тоқаев卡瑟姆若马尔特·托卡耶夫自2019年3月20日在任任期7年首任努尔苏丹·纳扎尔巴耶夫设立1990年4月24日(哈薩克蘇維埃社會主義共和國總統) 哈萨克斯坦 哈萨克斯坦政府...

 

 

1992 film by Alexandre Rockwell For the British film, see In the Soup (1936 film). In the SoupDirected byAlexandre RockwellWritten byTim KissellAlexandre RockwellProduced byJim StarkHank BlumenthalChosei FunaharaStarring Seymour Cassel Steve Buscemi Jennifer Beals CinematographyPhil ParmetEdited byDana CongdonMusic byMaderDistributed byTriton PicturesRelease dates January 1992 (1992-01) (Sundance) October 23, 1992 (1992-10-23) (New York City) Running time93 mi...

Artikel ini tentang tahun 1912. 1912MileniumMilenium ke-2AbadAbad ke-19Abad ke-20 Abad ke-21Dasawarsa 1890-an1900-an1910-an1920-an1930-anTahun1909191019111912191319141915 1912 (MCMXII) adalah tahun kabisat yang diawali hari Senin dalam kalender Gregorian dan tahun kabisat yang diawali hari Minggu dalam kalender Julian, tahun ke-1912 dalam sebutan Masehi (CE) dan Anno Domini (AD), tahun ke-912 pada Milenium ke-2, tahun ke-12 pada Abad ke-20, dan tahun ke- 3 pada dekade 1910-an. Denom...

 

 

For the band, see Home Video (band). For the album by Lucy Dacus, see Home Video (album). For motion pictures made by amateurs, see Home movies. This article needs additional citations for verification. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed.Find sources: Home video – news · newspapers · books · scholar · JSTOR (April 2021) (Learn how and when to remove this message) Pr...

 

 

Metropolitan area in EgyptGreater Cairo Area القاهرة الكبرىMetropolitan areaCoordinates: 30°03′N 31°22′E / 30.050°N 31.367°E / 30.050; 31.367Country EgyptCore citiesCairoGizaBanhaSatellite citiesOct 6Sheikh ZayedNew Cairo15 May CityBadrShubra El KheimaObour10th of Ramadan CityNew Administrative CapitalArea[a][1] • Metro2,734 km2 (1,056 sq mi)Population • Estimate (2023)[2]22,...

American college basketball season 2019–20 Northwestern State Demons basketballConferenceSouthland ConferenceRecord15–15 (11–9 Southland)Head coachMike McConathy (21st season)Assistant coaches Jeff Moore Dave Simmons Jacob Spielbauer Home arenaPrather ColiseumSeasons← 2018–192020–21 → 2019–20 Southland Conference men's basketball standings vte Conf Overall Team W   L   PCT W   L   PCT Stephen F. Austin 19 – 1   .950 28...

 

 

Type of pistol Not to be confused with Machine pistol. A Glock 22 semi-automatic pistol chambered in .40 S&W with a tactical light mounted below its barrel. A semi-automatic pistol (also called a self-loading pistol, autopistol, or autoloading pistol[1]) is a handgun that automatically ejects and loads cartridges in its chamber after every shot fired. Only one round of ammunition is fired each time the trigger is pulled, as the pistol's fire control group disconnects the trigger m...

 

 

Professional core of the US Army World War II-era poster advertising a career in the Regular Army The Regular Army of the United States succeeded the Continental Army as the country's permanent, professional land-based military force.[1] In modern times, the professional core of the United States Army continues to be called the Regular Army (often abbreviated as RA). From the time of the American Revolution until after the Spanish–American War, state militias and volunteer regiments...

Spanish Wells DistrikLokasi di BahamaNegara BahamaKelompok pulauRussel IslandLuas • Total26 km2 (10 sq mi)Populasi • Total1.551 • Kepadatan60/km2 (150/sq mi)Kode ISO 3166-2BS-SW Spanish Wells adalah salah satu distrik di Bahama. Kode ISO 3166-2 daerah ini adalah BS-SW. lbsPemerintah daerah di BahamaDistrik tingkat dua Abaco Selatan Abaco Tengah Abaco Utara Andros Selatan Andros Tengah Andros Utara Cat Island Eleuthera Tengah Eleuthe...

 

 

System of government Not to be confused with Semi-parliamentary system or Presidential system. World's states coloured by systems of government: Parliamentary systems: Head of government is elected or nominated by and accountable to the legislature   Constitutional monarchy with a ceremonial monarch   Parliamentary republic with a ceremonial president   Parliamentary republic with an executive president Presidential system: Head of government (president) is popul...

 

 

This article does not cite any sources. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed.Find sources: Stump drawing – news · newspapers · books · scholar · JSTOR (December 2009) (Learn how and when to remove this message) For other uses, see Stump (disambiguation). Stump A stump is a cylindrical drawing tool, usually made of soft paper that is tightly wound into a stick and...

Lento/Velocesingolo discograficoScreenshot tratto dal video del branoArtistaTiziano Ferro Pubblicazione21 aprile 2017 Durata3:19 Album di provenienzaIl mestiere della vita Genere[2]Contemporary R&B[1]Neo soulElettropop EtichettaUniversal ProduttoreMichele Canova Iorfida Registrazione2016, Kaneepa Studio, Los Angeles (California) FormatiDownload digitale, 10 CertificazioniDischi di platino Italia (2)[3](vendite: 100 000+) Tiziano Ferro - cron...

 

 

محتوى هذه المقالة بحاجة للتحديث. فضلًا، ساعد بتحديثه ليعكس الأحداث الأخيرة وليشمل المعلومات الموثوقة المتاحة حديثًا. يفتقر محتوى هذه المقالة إلى الاستشهاد بمصادر. فضلاً، ساهم في تطوير هذه المقالة من خلال إضافة مصادر موثوق بها. أي معلومات غير موثقة يمكن التشكيك بها وإزالت�...