2016-04-14 17 views
0

Ich möchte eine Funktion parallel anwenden mit snow::clusterApply. Meine Funktion verwendet einen temporären (vordefinierten) Seed in einem Teil der Funktion, sollte aber im Allgemeinen unabhängige Zufallszahlen beibehalten. Die temporären Samen unterscheiden sich für jeden "Job".R snow rlecuyer: Funktion mit temporärem Seed anwenden

ich tun kann, folgende:

# setting up cluster of type="SOCK" 
library(snow) 
cl <- makeSOCKcluster(2) 

# this is my function 
myfu <- function(seed){ 
    # temporary seed: 
    x <- R.utils::withSeed(rnorm(10),seed) 
    # more calculation with independent RNG: 
    y <- x*rnorm(10) 
    return(list(stays=x,changes=y)) 
} 

# run example: 
seed <- 1:4 
data.frame(clusterApply(cl,seed,myfu)) 
# reproduce 
data.frame(clusterApply(cl,seed,myfu)) 

stopCluster(cl) 

Doch nach dem Link in der "Uniform Random Number Generation in SNOW Cluster" in der Paketdokumentation Schnee gegeben (http://homepage.stat.uiowa.edu/~luke/R/cluster/cluster.html), habe ich gelesen, dass „Der Standard Zufallszahlengeneratoren sind wahrscheinlich ziemlich korreliert "und man sollte zusätzliche Pakete verwenden, wie z das Paket rlecuyer.

Nun, wenn ich versuche, dass in meinem Code enthalten, set.seed oder withSeed sind keine Verwendung mehr:

# setting up cluster of type="SOCK" 
library(snow) 
library(rlecuyer) 
cl <- makeSOCKcluster(2) 

# setup RNG Stream 
clusterSetupRNGstream(cl,seed=1:6) 

# run example: 
seed <- 1:4 
data.frame(clusterApply(cl,seed,myfu)) 
# can't reproduce 
data.frame(clusterApply(cl,seed,myfu)) 

stopCluster(cl) 

Wie kann ich arbeiten, um set.seed oder withSeed parallel, wenn ich sie auf einem anrufen müssen Job-Basis und nicht vor dem clusterApply Anruf?

Antwort

0

Dumm mir. Mit kind="L'Ecuyer-CMRG" beim Aufruf set.seed/withSeed löst (natürlich) mein Problem.