I took a course in graduate school (“Statistical Analysis for Digital Simulation”) at Texas Tech from Dr. Elliot Montes in which we spent a lot of time on the generation and analysis of random numbers. Here is a simple-yet-powerful pseudo-random number generator that I learned about in that course. It is named “The MLS Junk Generator” after Dr. Milton L. Smith.
I have also released an Excel/VBA implementation and provided the simple R code used as the basis for this package.
For any seed values of w, x, y, z:
ri = 5.980217w2 + 9.446377x0.25 + 4.81379y0.33 + 8.91197z0.5
ri = ri - Int(ri)
For ri+1:
w = x
x = y
y = z
z = ri
This generator tends to do well with various tests for randomness (K-S, Chi Square, test for runs up and down). It may not perform as well on other tests (e.g., tests for runs above and below the mean), but that could relate to my choice of seeds. As a point of reference, the period of Excel’s built-in random number generator is 16,777,216 (at least in Excel 2003; the algorithm may have changed in Excel 2007 or 2010 [Edit: this seems to still be the period of Excel’s RNG.]) and the MLS Junk Generator’s period is something greater than 9.9 billion
The package consists of four functions:
junkgen
- generates a pseudo-random number from user-specified seedsmlsjunkgenv
- generates a vector of pseudo-random numbers by calling junkgen
a user-specified number of timesmlsjunkgend
- generates a data frame of pseudo-random numbers by calling junkgen
a user-specified number of timesmlsjunkgenm
- generates a user-specified size matrix of pseudo-random numbers by calling mlsjunkgenv
and assigning the results to a matrixjunkgen
generates a single pseudo-random number based on four user-specified seeds:
w <- 1
x <- 2
y <- 3
z <- 4
junkgen(w = w, x = x, y = y, z = z)
## [1] 0.9551644
mlsjunkgenv
generates a vector containing a stream of n
(default = 1) user-specified pseudo-random numbers based on four user-specified seeds rounded to a specified (default = 5) number of decimal places:
mlsjunkgenv(n = 10, w = w, x = x, y = y, z = z, round = 8)
## [1] 0.9551644 0.6690774 0.2123540 0.3448801 0.1199463 0.5639798 0.5923515
## [8] 0.1143156 0.3352500 0.7027079
The same example with default rounding:
mlsjunkgenv(n = 10, w = w, x = x, y = y, z = z)
## [1] 0.95516 0.66908 0.21235 0.34488 0.11995 0.56398 0.59235 0.11432 0.33525
## [10] 0.70271
mlsjunkgend
generates a data frame containing a stream of n
user-specified pseudo-random numbers based on four user-specified seeds:
mlsjunkgend(n = 10, w = w, x = x, y = y, z = z, round = 8)
## RN
## 1 0.9551644
## 2 0.6690774
## 3 0.2123540
## 4 0.3448801
## 5 0.1199463
## 6 0.5639798
## 7 0.5923515
## 8 0.1143156
## 9 0.3352500
## 10 0.7027079
The same example with default rounding:
mlsjunkgend(n = 10, w = w, x = x, y = y, z = z)
## RN
## 1 0.95516
## 2 0.66908
## 3 0.21235
## 4 0.34488
## 5 0.11995
## 6 0.56398
## 7 0.59235
## 8 0.11432
## 9 0.33525
## 10 0.70271
mlsjunkgenm
generates a matrix of user-specified size containing a stream of pseudo-random numbers based on four user-specified seeds:
mlsjunkgenm(nrow = 5, ncol = 5, w = w, x = x, y = y, z = z, round = 3)
## [,1] [,2] [,3] [,4] [,5]
## [1,] 0.955 0.564 0.418 0.052 0.020
## [2,] 0.669 0.592 0.313 0.663 0.110
## [3,] 0.212 0.114 0.920 0.802 0.685
## [4,] 0.345 0.335 0.379 0.160 0.286
## [5,] 0.120 0.703 0.280 0.586 0.452