2015-05-26 3 views
5

La mia domanda è un follow-up di http://rcpp-devel.r-forge.r-project.narkive.com/qJMEsvOK/setting-the-r-random-seed-from-rcpp.Rcpp imposta lo stato RNG su uno stato precedente

Voglio essere in grado di impostare lo stato RNG in uno stato precedente da C++. Ad esempio, desidero il seguente codice per produrre una matrice in cui ogni colonna contiene le stesse realizzazioni di variabili casuali Gamma.

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]) 

Ma non sembra funzionare. In R, posso ottenere il risultato con linee come

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

Mi manca qualcosa di ovvio? Qualsiasi aiuto sarebbe molto apprezzato!

risposta

3

Questo potrebbe non funzionare (facilmente) - c'è una lingua in Writing R Extension che afferma che non è possibile impostare il seed dall'API di livello C.

Ora, si potrebbe barare:

  1. Init RNG da R
  2. fare un certo lavoro, assicurarsi che questo è avvolto da RNGScope come il nostro codice fa comunque.
  3. Ora imbroglia e utilizza Rcpp::Function() per richiamare set.seed().
  4. Considerare se tornare al punto 2 o per finire.
+0

Grazie per il vostro aiuto. Il problema è che voglio farlo ripetutamente dal codice Rcpp, quindi non saprei quale valore usare nella chiamata 'set.seed' senza" leggerlo "in qualche modo da' .Random.seed'. Sembra che sarebbe più facile codificare il mio algoritmo in R con chiamate raramente a funzioni Rcpp, in modo da poter copiare e ripristinare la variabile '.Random.seed' dall'interno R. Sono corretto? –

+0

Davvero non lo so. Forse vuoi prendere in considerazione l'utilizzo di un motore RNG diverso? Un sacco di compromessi qui. –