# [Rd] all zeroes in Mersenne Twister state may remain undetected

From: Petr Savicky <savicky_at_cs.cas.cz>
Date: Mon, 15 Oct 2007 12:49:22 +0200

The function runif(n) contains a protection against a corrupted .Random.seed. Besides other things, it tests whether at least one of the numbers .Random.seed[3:626] is not zero. If all(.Random.seed[3:626]==0), then the internal Mersenne Twister state is regenerated using current time, since a zero state is a fixed point of the recurrence and, hence, produces a constant sequence.

However, the condition any(.Random.seed[3:626]!=0) does not imply that the internal Mersenne Twister state is indeed not zero, since only the most significant bit of .Random.seed belongs to the internal state. Hence, the number of bits in the state of Mersenne Twister is 624*32 - 31 = 19937, which explains the period 2^19937-1.

For example, if .Random.seed == 1, we always have the condition   any(.Random.seed[3:626]!=0)
satisfied, but the internal state may still be effectively zero. An example of such a situation is
RNGkind("default")
.Random.seed[3:626] <- as.integer(0)
.Random.seed <- as.integer(1)

x <- runif(10000)
all(x==x) # TRUE
length(unique(x)) # 1
all(.Random.seed[3:626]==0) # TRUE
Here, the internal state was effectively zero, but this fact was not detected, since some (unimportant) bits of .Random.seed were not zero.

On the contrary, if also .Random.seed==0, then the internal state is regenerated and the output of runif() becomes non constant:   RNGkind("default")
.Random.seed[3:626] <- as.integer(0)

x <- runif(10000)
all(x==x) # FALSE
length(unique(x)) # 10000
all(.Random.seed[3:626]==0) # FALSE

The following patch to FixupSeeds corrects the detection of zero state:

Petr Savicky.

R-devel_at_r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel Received on Mon 15 Oct 2007 - 10:57:08 GMT

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.2.0, at Thu 25 Oct 2007 - 11:37:11 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-devel. Please read the posting guide before posting to the list.