从随机工具箱库运行Mersenne-Twister实现,我得到了不同的结果。
library(randtoolbox)
set.generator('MersenneTwister',initialization='init2002',resolution=53,seed=42)
runif(10)Windows上的结果:
[1] 0.37454012 0.95071431 0.73199394 0.59865848 0.15601864 0.15599452 0.05808361 0.86617615 0.60111501 0.70807258 # WindowsLinux上的结果:
[1] 0.95071431 0.15599452 0.86617615 0.02058449 0.83244264 0.30424224 0.52475643 0.61185289 0.36636184 0.45606998为什么会发生这种事?有什么办法让他们对齐吗?
附注:从命令行运行:
Rscript -e "library(randtoolbox);set.generator('MersenneTwister',initialization='init2002',resolution=53,seed=42);runif(10)"发布于 2019-07-09 22:53:55
它是随机工具箱中的一个bug :C代码不使用宽度基整数类型(如uint32_t ),当int和long的宽度不同时(比如在Linux 64位上,而不是在Windows上),C代码有一些微妙的错误。例如,在文件mt19937ar.c中,将一个int分配给一个未签名的长,这将导致符号扩展名:
static unsigned long mt[N]; /* the array for the state vector */
...
void putMersenneTwister(int *init, int *res, int *state)
{
...
for (i=0; i<N; i++)
mt[i] = state[i+1];如果将最后一行替换为:
mt[i] = state[i+1] & 0xffffffffUL;窃听器消失了。
只需下载源代码、解压缩、修补并执行:
R CMD INSTALL randtoolbox在包父目录中。
https://stackoverflow.com/questions/56957642
复制相似问题