2014-04-04 33 views
5

Ho molti processi casuali indipendenti (i processi di arrivo dicono) che mi richiedono di generare numeri casuali. Voglio utilizzare numeri casuali comuni per ciascuno di questi processi che posso confrontare come si comportano le diverse politiche quando si controllano queste politiche.Posso avere più generatori di numeri casuali indipendenti in R come posso in C++?

voglio processo dalla A alla disciplinato dal generatore A (utilizzando seme A) voglio Processo B ad essere disciplinati dalle Generator B (utilizzando seme B) ..

e così via.

È possibile implementare in R. Non riesco a trovare nessuno che lo abbia eseguito. Ho provato. Perdonami se questa è una domanda ripetuta.

Grazie

Jak

+0

Supporto C++ 11 nel compilatore? – Yakk

+2

Perché non prepari tutti i tuoi numeri casuali usando i diversi semi? A e B possono avere una politica sulla scelta di numeri dal set generato senza ripetizioni (indici pari/dispari in cui le probabilità hanno un seme e un altro, sequenziale, ecc.). Quando finisci i numeri, se questo è un problema, genera di più. – mockinterface

+0

Penso che sia l'approccio migliore che ho. Potrebbe essere inefficiente generare e archiviare più numeri di quanti avrò mai bisogno di usare, ma se non c'è modo di avere "diverse pile indipendenti" di numeri casuali in offerta, dovrò pensare a un'implementazione intelligente del suggerimento di mockinterface . Grazie per le vostre risposte rapide. –

risposta

4

Questa è una cosa che ho voluto fare occasionalmente - e non ho ancora venire con molto meglio di quanto segue kludge (che è realmente utile solo se si è usando solo 1 o 2 diverse distribuzioni casuali, come si deve scrivere una funzione per ogni:.

#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 

mi immagino che il <<- romperà se my_runif chiamate dall'interno di un'altra funzione

01.235.164,106 mila
fortunes::fortune("<<-") 

ETA: Il seguente potrebbe essere più robusta

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

Beh, la buona notizia è che già fate - vedi 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. 

e user-supplied consente di utilizzare il proprio.

E per N (0,1), si hanno anche

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

Per il lavoro in parallelo, vedere la (eccellente) vignetta del pacchetto parallel che è venuto con R. Ci sono generatori esistenti per più thread/core/... ecc.

Ultimo ma non meno importante, R è ovviamente estendibile e si potrebbe ad esempio utilizzare Rcpp dove abbiamo alcuni post su numeri casuali over at the Rcpp Gallery site.