从 randtoolbox 库运行 Mersenne-Twister 实现,我得到不同的结果
library(randtoolbox)
set.generator('MersenneTwister',initialization='init2002',resolution=53,seed=42)
runif(10)
视窗上的结果:
[1] 0.37454012 0.95071431 0.73199394 0.59865848 0.15601864 0.15599452 0.05808361 0.86617615 0.60111501 0.70807258 # Windows
在 Linux 上的结果:
[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)"
这是 randtoolbox 中的一个错误:C 代码不使用像uint32_t这样的基于宽度的整数类型,并且当int和long在宽度上不同时(如在 Linux 64 位上,但在 Windows 上不是),有一些细微的错误。例如,在文件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
在包父目录中。