我可以在C中使用多个独立的随机数生成器吗?

时间:2014-04-04 13:13:33

标签: c++ r random simulation random-seed

我有许多独立的随机过程(到达过程说),要求我生成随机数。我想为每个流程使用通用随机数,我可以比较控制这些策略时不同策略的执行情况。

我希望流程A由生成器A(使用种子A)管理 我希望进程B由生成器B管理(使用种子B) ..

等等。

这是否可以在R中实施。我无法找到任何已经完成它的人。我试过了。如果这是一个重复的问题,请原谅我。

由于

的Jak

2 个答案:

答案 0 :(得分:4)

这是我偶尔想要做的事情 - 而且还没有比以下的kludge好得多(只有当你只使用1或2时它才真正有用)不同的随机分布,因为你必须为每个分配一个函数:

#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

我想象如果你从另一个函数中调用my_runif,<<-会中断。

fortunes::fortune("<<-")

ETA: 以下可能更健壮

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
}

答案 1 :(得分:3)

好消息是您已经 - 请参阅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.

user-supplied可让您自己使用。

对于N(0,1),你也有

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

对于并行工作,请参阅R附带的parallel包的(优秀)插图。有多个线程/核心的现有生成器/ ...等。

最后但并非最不重要的是,R当然是可扩展的,例如你可以在我们的地方使用Rcpp 有一些关于随机数over at the Rcpp Gallery site的帖子。