1970s Random Number Generator by Irregular Shed photo credit: Irregular Shed

-[ background ]-

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 thought of it recently [07/2012] (not sure why) and decided to share.

[Update 02/2015] Now that I’m learning R, I decided to convert the generator to that language and clean-up and post the Excel/VBA versions I already had.

[Update 08/2015] This is now available as an R package (CRAN, GitHub).

-[ the mls junk generator ]-

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

zri

-[ analysis ]-

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 (I gave up on trying to calculate it when it reached that point).

-[ vba code ]-

Here is an example of VBA code that generates a stream of random numbers in column A in Excel, assuming user-defined values of the parameters wxy, z, _and _n (the number of random numbers to generate) in cells C1 to C5. This can be downloaded in .xlsm or .bas format (see below).

Option Explicit
 Public Sub MLS_Junk_Generator()
 Dim r, ri, w, x, y, z As Single
 Dim i, n As Integer
  Application.ScreenUpdating = False
   n = Cells(1, 3).Value
   w = Cells(2, 3).Value
   x = Cells(3, 3).Value
   y = Cells(4, 3).Value
   z = Cells(5, 3).Value

   Cells(1, 1).Value = "MLS Junk Generator Stream"

   For i = 1 To n
     r = 5.980217 * (w^2) + 9.446377 * (x^0.25) + 4.81379 * (y^0.33) + 8.91197 * (z^0.5)
     ri = r - Int(r)
     Cells(i + 1, 1).Value = Format(ri, "0.0000")
     w = x
     x = y
     y = z
     z = ri
   Next i
   Application.ScreenUpdating = True
 End Sub

-[ r code (aka MLS Junk GeneratR) ]-

In February 2015, I wrote two R functions with the same user-defined parameters as the VBA code above. The file (see below) also contains a version of this function that generates a data frame.

-[ r package (mlsjunkgen) ]-

Installation:

  • mlsjunkgen is available on CRAN and can be installed accordingly:
   install.packages("mlsjunkgen") 
   library(mlsjunkgen)
  • updates to mlsjunkgen can be installed from GitHub using the devtools package:
   install.packages("devtools")
   library(devtools)
   install_github("scumdogsteev/mlsjunkgen")
   library(mlsjunkgen)

Functions

The package consists of four functions:

  1. junkgen - generates a pseudo-random number from user-specified seeds
  2. mlsjunkgenv - generates a vector of pseudo-random numbers by calling junkgen a user-specified number of times
  3. mlsjunkgend - generates a data frame of pseudo-random numbers by calling junkgen a user-specified number of times
  4. mlsjunkgenm - generates a user-specified size matrix of pseudo-random numbers by calling mlsjunkgenv and assigning the results to a matrix

Examples:

junkgen 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
#>  [9] 0.33525 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.34489
#> 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 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

Versions of mlsjunkgen will be named after things related to Texas Tech University.

-[ license ]-

  • All implementations are licensed under the MIT License

-[ project changelog ]-

2021-04-19

  • v0.1.2 of R package (Double T) released, see above for package release notes

2015-09-07

  • v0.1.1 of R package (Masked Rider) released, see above for package release notes

2015-08-16

  • v0.1.0 of R package (Raider Red) created, see above for package release notes

2015-02-01

  • files posted to GitHub
  • v.0.1.0 of Excel/VBA implementation released
  • R version created

2015-01-31

  • Excel files updated

2012-07-06

  • VBA code sample posted online

Spring 2004

  • VBA code written

-[ download excel/vba implementation ]-

[ releases ] | [ all files ]

  1. mls_junk_generator1.xlsm - simple Excel implementation
  2. mls_junk_generator.bas - VBA source for #1
  3. mls_junk_generator2.xlsm - second Excel implementation (allows for clearing of the RN stream)
  4. MLSJunkGen.bas - VBA module for #3

-[ download original r implementation ]-

[ all files ] | [ r source ]

-[ download/install r package ]-



Comments: