2014-04-04 10 views
5

Ich habe viele unabhängige zufällige Prozesse (Ankunft Prozesse sagen), die mich erfordern, Zufallszahlen zu generieren. Ich möchte für jeden dieser Prozesse allgemeine Zufallszahlen verwenden, mit denen ich vergleichen kann, wie sich verschiedene Richtlinien bei der Steuerung dieser Richtlinien verhalten.Kann ich mehrere unabhängige Zufallszahlengeneratoren in R haben wie ich in C++?

Ich möchte Verfahren A von Generator A regiert werden (Samen A verwendet wird) I Verfahren B wollen durch Generator B regiert werden (Samen B verwendet wird) ..

und so weiter.

Ist es möglich, in R zu implementieren. Ich kann niemanden finden, der es getan hat. Ich habe versucht. Verzeih mir, wenn das eine wiederholte Frage ist.

Dank

Jak

+0

C++ 11 Unterstützung im Compiler? – Yakk

+2

Warum generierst du nicht alle deine Zufallszahlen mit den verschiedenen Samen vor? A und B können eine Politik haben, Nummern aus dem generierten Satz ohne Wiederholungen zu wählen (gerade/ungerade Indizes, bei denen die Odds einen Seed haben und einen anderen Sequence, Sequence usw.). Wenn Sie keine Zahlen mehr haben, generieren Sie mehr, wenn das ein Problem ist. – mockinterface

+0

Ich denke, das ist der beste Ansatz, den ich habe. Es kann ineffizient sein, dass ich viel mehr Zahlen erzeuge und speichere, als ich jemals brauchen werde, aber wenn es keine Möglichkeit gibt, mehrere unabhängige Stapel von Zufallszahlen im Angebot zu haben, muss ich an eine clevere Umsetzung des Mockinterface-Vorschlags denken . Vielen Dank für Ihre schnellen Antworten. –

Antwort

4

Dies ist etwas, das ich gelegentlich zu tun haben wollte - und haben noch mit viel besser als die folgenden Flickschusterei nicht kommen (was, wenn Sie wirklich nützlich ist, sind mit nur 1 oder 2 unterschiedliche Zufallsverteilungen, wie Sie eine Funktion für jeden schreiben.

#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 

ich mir vorstellen würde, dass die <<- brechen, wenn Sie my_runif aus innerhalb einer anderen Funktion aufrufen

fortunes::fortune("<<-") 

ETA: Die folgende könnte

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 
} 
3

Nun die gute Nachricht robuster ist , dass Sie bereits tun - siehe 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. 

und user-supplied können Sie Ihre eigenen verwenden.

Und für N (0,1), haben Sie auch

‘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’.) [...] 

Für die parallele Arbeit, die (sehr zufrieden) Vignette des parallel Paket sehen, die mit R. kam Es gibt bestehende Generatoren für mehrere Threads/Kerne/... usw.

Last but not least, R ist natürlich erweiterbar und Sie könnten zum Beispiel Rcpp verwenden, wo wir ein paar Posts auf Zufallszahlen haben over at the Rcpp Gallery site.

Verwandte Themen