## Understanding Random Number Generator in R

“Mersenne-Twister”is default method for generating random number. The brief description is

“From Matsumoto and Nishimura (1998). A twisted GFSR with period 2^19937 – 1 and equidistribution in 623 consecutive dimensions (over the whole period). The ‘seed’ is a 624-dimensional set of 32-bit integers plus a current position in that set.”

At any given moment, “the current seed” is stored in “.Random.seed”. For a short example below, here is what the .Random.seed looks like.

```> runif(5)
 0.5214241 0.6072482 0.8581209 0.1057113 0.4943451
> length(.Random.seed)
 626```

# It is 626 long.

```> head(.Random.seed)
         403           5   524275616  -891164866   839495241  2076756731  -695076150```

# The first value is the type of random number generator, in this case “Mersenne-Twister”.

# The second value is the “current position” in the set

# The other 624 numbers stored in .Random.seed are what they call “seed”.

# So, if you simulated another 5 random numbers,

```> runif(5)
 0.9766740 0.9481603 0.1786681 0.4026092 0.7110552```

# The current position changed from 5 (above) to 10 (see below). Notice that other 624 numbers in the set remained the same.

`> head(.Random.seed)         403          10   619611805 -1461824745 -1054662018 -1340796360`

# Once you simulate 624th random number, the index of current position will be 624.

`> runif(1) 0.8074707> head(.Random.seed)         403         624   619611805 -1461824745 -1054662018 -1340796360`

# When you simulate one more random number, a new seed will then be used.

```> runif(1)
 0.6062263> head(.Random.seed)         403           1 -1016206940   813281659 -1786346428  -363208600```

# So, any given moment, you can save the current seed that will be used for the next simulation by

```> my.seed <- .Random.seed
> runif(10)
 0.8797226 0.2143323 0.6826555 0.4366940 0.4330555 0.5745667 0.7406138 0.4646236 0.8014502 0.9818474```

# This saved the current seed to be used for the next simulation in “my.seed”

# You can then restore the current seed and reproduce the above simulated numbers by

> .Random.seed <- t(my.seed)
> runif(10)
 0.8797226 0.2143323 0.6826555 0.4366940 0.4330555 0.5745667 0.7406138 0.4646236 0.8014502 0.9818474

# See that the runif(10) here gave the same numbers as the one above.