2015-05-26 11 views
5

Meine Frage ist ein Follow-up von http://rcpp-devel.r-forge.r-project.narkive.com/qJMEsvOK/setting-the-r-random-seed-from-rcpp.Rcpp setzte den RNG-Zustand auf einen früheren Zustand

Ich möchte in der Lage sein, den RNG-Zustand aus C++ in einen früheren Zustand zu setzen. Zum Beispiel möchte ich, dass der folgende Code eine Matrix erzeugt, in der jede Spalte die gleichen Realisierungen von Gamma-Zufallsvariablen enthält.

cppFunction('NumericMatrix rgamma_reset_seed(int n, double shape, double rate){ 
      RNGScope rngscope; 
      Environment g = Environment::global_env(); 
      Environment::Binding RandomSeed = g[".Random.seed"]; 
      IntegerVector someVariable = RandomSeed; 
      NumericMatrix results(n, 2); 
      results(_,0) = rgamma(n, shape, 1/rate); 
      RandomSeed = someVariable; 
      results(_,1) = rgamma(n, shape, 1/rate); 
      return results; 
}') 
m <- rgamma_reset_seed(1000, 1.2, 0.8) 
par(mfrow = c(2, 1)) 
plot(m[,1]) 
plot(m[,2]) 

Aber es scheint nicht zu funktionieren. In R, kann ich das Ergebnis von Linien wie

.Random.seed <- x # reset the state to x 
x <- .Random.seed # store the current state 

erreichen Ich fehle etwas offensichtlich? Jede Hilfe würde sehr geschätzt werden!

Antwort

3

Dies funktioniert möglicherweise nicht (leicht) - es gibt eine Sprache in Writing R Extension, die besagt, dass Sie den Seed von der C-Ebene API nicht festlegen können.

Jetzt könnten Sie betrügen:

  1. Init RNG von R
  2. einige Arbeit tun, stellen Sie sicher, dass dies durch RNGScope gewickelt ist wie unser Code ohnehin der Fall ist.
  3. Jetzt betrügen und Rcpp::Function() verwenden, um set.seed() aufzurufen.
  4. Überlegen Sie, ob Sie zu Schritt 2 zurückkehren oder den Vorgang beenden möchten.
+0

Danke für Ihre Hilfe. Das Problem ist, dass ich dies wiederholt innerhalb von Rcpp-Code tun möchte, also würde ich nicht wissen, welchen Wert ich für den 'set.seed'-Aufruf verwenden soll, ohne" irgendwie "von' .Random.seed' zu lesen. Es scheint einfacher zu sein, meinen Algorithmus in R mit seltenen Aufrufen von Rcpp-Funktionen zu programmieren, so dass ich die '.Random.seed'-Variable innerhalb von R kopieren und wiederherstellen kann. Bin ich richtig? –

+0

Ich weiß es wirklich nicht. Vielleicht möchten Sie eine andere RNG-Engine verwenden? Viele Kompromisse hier. –

Verwandte Themen