Puis-je avoir plusieurs générateurs de nombres aléatoires indépendants dans R comme je peux en C ++?

J’ai de nombreux processus aléatoires indépendants (les processus d’arrivée, par exemple) qui m’obligent à générer des nombres aléatoires. Je souhaite utiliser des nombres aléatoires communs pour chacun de ces processus afin de pouvoir comparer les performances des différentes stratégies lors du contrôle de ces stratégies.

Je veux que le processus A soit régi par le générateur A (en utilisant la graine A). Je veux que le processus B soit régi par le générateur B (en utilisant la graine B).

etc.

Est-ce possible d’implémenter dans R. Je ne trouve personne qui l’ait fait. J’ai essayé. Pardonnez-moi s’il s’agit d’une question répétée.

Merci

Jak

C’est quelque chose que j’ai occasionnellement voulu faire – et que je n’ai pas encore trouvé beaucoup mieux que le kludge suivant (qui n’est vraiment utile que si vous n’utilisez que 1 ou 2 dissortingbutions aléatoires différentes, car vous devez écrire une fonction pour chacun:

 #Make a list of seeds - generalises to mkore than 2 seed <- list(NA,NA) set.seed(1) seed[[1]] <- .Random.seed set.seed(2) seed[[2]] <- .Random.seed my_runif <- function(...,which.seed=1) { .Random.seed <<- seed[[which.seed]] x <-runif(...) seed[[which.seed]] <<- .Random.seed x } ##Print some data for comparison > set.seed(1); runif(10) [1] 0.26550866 0.37212390 0.57285336 0.90820779 0.20168193 0.89838968 0.94467527 0.66079779 0.629114040.06178627 > set.seed(2); runif(10) [1] 0.1848823 0.7023740 0.5733263 0.1680519 0.9438393 0.9434750 0.1291590 0.8334488 0.4680185 0.5499837 #Test > my_runif(1,which.seed=1) [1] 0.2655087 > my_runif(1,which.seed=1) [1] 0.3721239 > my_runif(1,which.seed=1) [1] 0.5728534 > my_runif(1,which.seed=2) [1] 0.1848823 > my_runif(1,which.seed=1) [1] 0.9082078 

J’imagine que le <<- se cassera si vous appelez my_runif depuis une autre fonction.

 fortunes::fortune("<<-") 

ETA: Ce qui suit pourrait être plus robuste

 my_runif <- function(...,which.seed=1) { assign(".Random.seed", seed[[which.seed]], envir = .GlobalEnv) x <-runif(...) seed <- seed #Bring into local envir seed[[which.seed]] <- .Random.seed assign("seed", seed, envir = .GlobalEnv) x } 

La bonne nouvelle est que vous le faites déjà – voir l’ help(RNGkind) :

  The currently available RNG kinds are given below. 'kind' is partially matched to this list. The default is '"Mersenne-Twister"'. '"Wichmann-Hill"' [...] '"Marsaglia-Multicarry"': [...] '"Super-Duper"': [...] '"Mersenne-Twister"': [...] '"Knuth-TAOCP-2002"': [...] '"Knuth-TAOCP"': [...] '"L'Ecuyer-CMRG"': '"user-supplied"': Use a user-supplied generator. See 'Random.user' for details. 

et user-supplied utilisateur vous permet d’utiliser votre propre.

Et pour N (0,1), vous avez aussi

  'normal.kind' can be '"Kinderman-Ramage"', '"Buggy Kinderman-Ramage"' (not for 'set.seed'), '"Ahrens-Dieter"', '"Box-Muller"', '"Inversion"' (the default), or '"user-supplied"'. (For inversion, see the reference in 'qnorm'.) [...] 

Pour les travaux en parallèle, voir la (excellente) vignette du paquet parallel fourni avec R. Il existe des générateurs pour plusieurs threads / kernelx / … etc.

Enfin, R est bien sûr extensible et vous pouvez par exemple utiliser Rcpp où nous avons quelques posts sur des nombres aléatoires sur le site Rcpp Gallery .