[R] How to construct a valid seed for l'Ecuyer's method with given .Random.seed?
Duncan Murdoch
murdoch.duncan at gmail.com
Thu Jan 24 13:09:16 CET 2013
On 13-01-24 2:09 AM, Marius Hofert wrote:
> Dear Daniel,
>
> That's exactly what I also suspected (last post). The question now seems how to
> correctly convert .Random.seed from signed to unsigned so that it is accepted by
> the rlecuyer package.
The rlecuyer package assumes that seed values are positive internally,
because it does this conversion in the C code:
seed[i]= (unsigned long) REAL(sexp_seed)[i]
If you send it negative values, the result of this is undefined.
I'd suggest that the .lec.CheckSeed function should check for this and
quit if it's not true.
When you tried to convert everything to be positive, you used
seed <- .Random.seed[-1] + 2^32
This will put negative values into the right range, but positive values
will end up too big, and again the results in the C code will overflow.
You should be able to get proper behaviour this way:
seed <- .Random.seed[-1]
seed <- ifelse(seed < 0, seed + 2^32, seed)
which puts values into the legal range for an unsigned int. When I do
this, I don't get an error running
.lec.SetPackageSeed(seed)
You got an error Seed[1] >= 14, which comes from an error in the
rlecuyer package formatting of the error message. It is printing a
floating point value using a %d format, instead of %f.
Duncan Murdoch
More information about the R-help
mailing list