我有许多独立的随机过程(例如到达过程),需要我生成随机数。我想为这些过程中的每一个使用公共随机数,以便比较不同策略在控制这些策略时的执行情况。
我希望进程 A 由生成器 A 管理(使用种子 A)我希望进程 B 由生成器 B 管理(使用种子 B)..
等等。
这可以在 R 中实现吗?我找不到做过的人。我努力了。如果这是一个重复的问题,请原谅我。
谢谢
杰克
我有许多独立的随机过程(例如到达过程),需要我生成随机数。我想为这些过程中的每一个使用公共随机数,以便比较不同策略在控制这些策略时的执行情况。
我希望进程 A 由生成器 A 管理(使用种子 A)我希望进程 B 由生成器 B 管理(使用种子 B)..
等等。
这可以在 R 中实现吗?我找不到做过的人。我努力了。如果这是一个重复的问题,请原谅我。
谢谢
杰克
这是我偶尔想做的事情 - 并且还没有比下面的 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
}
好消息是您已经这样做了——请参阅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,我们在 Rcpp Gallery 站点上有一些关于随机数的帖子。