#random #mcg #rand #no-std

no-std randu

RANDU MCG65539 is IBM System/360 random number generator

5 releases

0.9.4 Aug 10, 2024
0.9.3 Aug 4, 2024
0.9.2 Aug 3, 2024
0.9.1 Aug 3, 2024
0.9.0 Aug 3, 2024

#1600 in Algorithms

21 downloads per month

Unlicense OR CC0-1.0

14KB
195 lines

RANDU

Version License MSRV no-std ready Safe Rust dependency status Documentation Downloads

RANDU is Pseudorandom multiplicative congruential generator (MCG). This generator was first introduced in the early 1960s; its use soon became widespread during 1960's and 1970's. Its part of the IBM Scientific Subroutine Library for IBM System/360 computers.

RANDU uses MCG coeficients multiplier a = 65539 ( 2^16 + 3 ) and modulus m = 2^31 and constant c = 0. It can be implemented very quickly on 32-bit hardware in just 2 operations: wrapping multiplication by a and bit masking of result using AND 0x7fffffff.

Generated values are positive 31 bit integers. Generator period is 2^29. Lower bits have low randomness and should not be used separately. Problem with lower bits randomness and not achieving full period is common for all congruential generators with power of 2 modulus.

RANDU fails the spectral test for dimensions greater than 2. RANDU produces very strong banding when used in 3 dimensions. All points in 3d space fall in 15 two-dimensional planes. This effect can be used in GPU programming for visual effects and take advantage of compute simplicity.

References

https://en.wikipedia.org/wiki/RANDU

https://oeis.org/A096555

https://en.wikipedia.org/wiki/Linear_congruential_generator

Spectral test

2d 3d 4d 5d 6d 7d 8d
0.93 0.012 0.059 0.16 0.29 0.45 0.62

Values 0.75 and higher are commonly considered as passing of the spectral test. While this generator failing higher dimensions it is a very strong in generating 2d data.

License

This is free and unencumbered software released into the public domain.

This code can be used under terms of CC0 or the Unlicense.

Unlicense logo

No runtime deps