2014-04-04 9 views
5

Mam wiele niezależnych procesów losowych (powiedzmy procesy nadejścia), które wymagają generowania liczb losowych. Chcę używać typowych liczb losowych dla każdego z tych procesów, dzięki czemu mogę porównać skuteczność różnych polityk podczas kontrolowania tych zasad.Czy mogę mieć wiele niezależnych generatorów liczb losowych w R jak ja w C++?

że chce Sposób A jest regulowany za pomocą prądnicy (A) za pomocą zaszczepienia że chce Sposób B jest regulowany przez generator B (za pomocą nasion B) ..

i tak dalej.

Czy można to zaimplementować w R. Nie mogę znaleźć nikogo, kto to zrobił. Próbowałem. Wybacz mi, jeśli to jest powtarzające się pytanie.

Dzięki

Jak

+0

Obsługa C++ 11 w kompilatorze? – Yakk

+2

Dlaczego nie wygenerujesz wszystkich liczb losowych za pomocą różnych nasion? A i B mogą mieć zasady wyboru liczb z wygenerowanego zbioru bez powtórzeń (nieparzyste/równomierne indeksy, gdy kurs ma jedno nasiono i wyrównuje kolejność, kolejność itd.). Kiedy zabraknie liczb, jeśli to jest problem, wygeneruj więcej. – mockinterface

+0

Myślę, że to najlepsze podejście, jakie mam. Może być nieefektywne, że generuję i przechowuję o wiele więcej liczb, niż kiedykolwiek będę musiał użyć, ale jeśli nie ma sposobu na "kilka niezależnych stosów" liczb losowych w ofercie, będę musiał pomyśleć o sprytnej implementacji sugestii mockinterface . Dziękuję za szybkie odpowiedzi. –

Odpowiedz

4

To jest coś, co ja chciałem zrobić od czasu do czasu - i jeszcze nie wymyślić wiele lepiej niż w następnym kludge (co jest bardzo przydatne, jeśli tylko jesteś używając tylko 1 lub 2 różnych rozkładów losowych, jak trzeba napisać funkcję dla każdego.

#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 

bym sobie wyobrazić, że <<- pęknie jeśli zadzwonisz my_runif od wewnątrz innej funkcji

fortunes::fortune("<<-") 

ETA: Poniższy może być bardziej wytrzymałe

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

Dobrze dobrą wiadomością jest to, że już zrobić - patrz 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. 

i user-supplied pozwala używać własnych.

A dla N (0,1), trzeba też

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

Do pracy równoległej, zobacz (doskonała) winieta pakietu parallel dołączonej R. Istnieje istniejące generatory dla wielu wątków/rdzeni/... itd.

Wreszcie, R jest oczywiście rozszerzalny i można na przykład użyć Rcpp gdzie mamy mieć kilka postów na liczbach losowych over at the Rcpp Gallery site.

Powiązane problemy