在Windows和Linux上为特定的PRNG生成的不同随机数

  • 本文关键字:PRNG 随机数 Windows Linux r
  • 更新时间 :
  • 英文 :


从 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这样的基于宽度的整数类型,并且当intlong在宽度上不同时(如在 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

在包父目录中。

最新更新