I need to do some simulations and for debugging purposes I want to use set.seed to get the same result. Here is the example of what I am trying to do:
library(foreach)
library(doMC)
registerDoMC(2)
set.seed(123)
a <- foreach(i=1:2,.combine=cbind) %dopar% {rnorm(5)}
set.seed(123)
b <- foreach(i=1:2,.combine=cbind) %dopar% {rnorm(5)}
Objects a and b should be identical, i.e. sum(abs(a-b)) should be zero, but this is not the case. I am doing something wrong, or have I stumbled on to some feature?
I am able to reproduce this on two different systems with R 2.13 and R 2.14
My default answer used to be “well then don’t do that” (using foreach) as the snow package does this (reliably!) for you.
But as @Spacedman points out, Renaud’s new doRNG is what you are looking for if you want to remain with the
doFoo/ foreach family.The real key though is a clusterApply-style call to get the seeds set on all nodes. And in a fashion that coordinated across streams. Oh, and did I mention that snow by Tierney, Rossini, Li and Sevcikova has been doing this for you for almost a decade?
Edit: And while you didn’t ask about snow, for completeness here is an example from the command-line:
Edit: And for completeness, here is your example combined with what is in the docs for doRNG