[R] How to create the/an integer 'seed' for set.seed() from a given .Random.seed?

Marius Hofert m@r|u@@ho|ert @end|ng |rom uw@ter|oo@c@
Sat Jul 20 15:44:40 CEST 2019


Hi,

1) Given .Random.seed, how can one compute *the* integer 'seed' such
that set.seed(seed) generates .Random.seed?
2) If 1) is not possible, how can one compute *an* integer 'seed' from
a given .Random.seed such that different .Random.seed's are guaranteed
to give different integers 'seed' (or at least with a very high
probability)? In other words, how can one construct an injective
function from .Random.seed objects to an integer?

(In an ideal world, this would work for all kinds of random number generators).

What I found out (... is not very much so far):
./src/main/names.c -> do_setseed() -> RNG.c -> RNG_Init() leads to (at
least for the Mersenne Twister)...
for(j = 0; j < RNG_Table[kind].n_seed; j++) {
    seed = (69069 * seed + 1);
    RNG_Table[kind].i_seed[j] = seed;
}
FixupSeeds(kind, 1);
... which gives some hope that the first entry in RNG_Table can be
used to access 'seed' (which could be the 3rd value of .Random.seed in
this case, but I'm not sure...).

Background (or 'why on earth would you...'): I have a function myRNG
of the following form (body explains the non-minimal problem):
myRNG <- function(n, method, ...) {
      if(method = "A") {
          <All random numbers I generate in here respect a global
'set.seed(seed)'
  command ('global' in the sense of calling set.seed() before calling 'myRNG').
  In particular, different 'seed' arguments of set.seed() correctly
  lead to different random numbers.>
      } else {
          <In here I'm calling a function 'obscure' from another package (which
  also generates some random numbers). Unfortunately, 'obscure' does not
  respect a global 'set.seed(seed)' (different 'seed' arguments to
  set.seed() always lead to the same outputs of 'obscure'). Luckily,
  'obscure' accepts an argument 'seed', so one can set a seed inside
  'obscure'. However, this argument 'seed' needs to be an integer.
  So if 1) or 2) above can be solved, I can use a global set.seed()
  and guarantee that different 'seed' arguments to set.seed() lead
  to different outputs of 'myRNG' also for this method (!= "A").>
      }
}

Thanks & cheers,
Marius



More information about the R-help mailing list