[R] How to construct a valid seed for l'Ecuyer's method with given .Random.seed?

Hana Sevcikova hanas at uw.edu
Wed Jan 23 22:43:49 CET 2013


Marius,

I looked it up in the original L'Ecuyer's paper: The seed must be larger 
than 0. Thus, the function defines the seed variable as unsigned long 
integer. You're passing a negative number, so I think there is some 
overflow going on.

The internal L'Ecuyer RNG is a modification of the original one (and I'm 
not familiar with it), but they seem to relax that restriction.

Hana


On 1/23/13 1:01 AM, Marius Hofert wrote:
> Since clusterSetupRNG() calls clusterSetupRNGstream() and this calls .lec.SetPackageSeed(), I could further minimalize the problem:
>
> set.seed(1)
> RNGkind("L'Ecuyer-CMRG") # => .Random.seed is of length 7 (first number encodes the rng kind)
> (seed <- .Random.seed[2:7]) # should give a valid seed for l'Ecuyer's RNG
> require(rlecuyer) # latest version 0.3-3
> .lec.SetPackageSeed(seed)
>
> The last line fails with:
>
> ,----
> | Error in .lec.SetPackageSeed(seed) :
> |   Seed[0] >= -767742437, Seed is not set.
> `----
>
> Looking at .lec.SetPackageSeed, "seed" seems to pass .lec.CheckSeed() [the check
> could probably be improved here (but further checking is done in the C code; see
> below)]:
>
> ,----
> | > .lec.SetPackageSeed
> | function (seed = rep(12345, 6))
> | {
> |     if (!exists(".lec.Random.seed.table", envir = .GlobalEnv))
> |         .lec.init()
> |     seed <- .lec.CheckSeed(seed) # => bad check since it's passed
> |     .Call("r_set_package_seed", as.double(seed), PACKAGE = "rlecuyer") # => this fails!
> |     return(seed)
> | }
> | <environment: namespace:rlecuyer>
> `----
>
> Going into the C code, r_set_package_seed calls RngStream_SetPackageSeed which in turn calls CheckSeed(seed). The relevant part of CheckSeed is this:
>
> ,----
> | for (i = 0; i < 3; ++i) {
> |     if (seed[i] >= m1) {
> |     	/* HS 01-25-2012 */
> |     	error("Seed[%1d] >= %d, Seed is not set.\n", i,m1);
> |        /* original code
> |          fprintf (stderr, "****************************************\n"
> |       	 "ERROR: Seed[%1d] >= m1, Seed is not set.\n"
> |       	 "****************************************\n\n", i);
> |           return (-1);
> |        */
> |      }
> | }
> `----
>
> Note that seed[0] in this (C-)code corresponds to the first element of my
> variable "seed", which is -1535484873. This should definitely be smaller than m1
> since m1 is defined as 4294967087.0 on line 34 in ./src/RngStream.c of the package 'rlecuyer'.
>
> Why is seed[i] then >= m1??? This is strange. Indeed, as you can see from the
> error message above, m1 is taken as -767742437 in my case (why?). Still (and even more
> confusing), -1535484873 >= -767742437 is FALSE (!) but the if(){} is entered
> anyways...
>
>
> Cheers,
>
> Marius



More information about the R-help mailing list