首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Windows和Linux上为特定的PRNG生成不同的随机数

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

Stack Overflow用户
提问于 2019-07-09 17:16:05
回答 1查看 153关注 0票数 0

从随机工具箱库运行Mersenne-Twister实现,我得到了不同的结果。

代码语言:javascript
复制
library(randtoolbox)
set.generator('MersenneTwister',initialization='init2002',resolution=53,seed=42)
runif(10)

Windows上的结果:

代码语言:javascript
复制
[1] 0.37454012 0.95071431 0.73199394 0.59865848 0.15601864 0.15599452 0.05808361 0.86617615 0.60111501 0.70807258 # Windows

Linux上的结果:

代码语言:javascript
复制
 [1] 0.95071431 0.15599452 0.86617615 0.02058449 0.83244264 0.30424224 0.52475643 0.61185289 0.36636184 0.45606998

为什么会发生这种事?有什么办法让他们对齐吗?

附注:从命令行运行:

代码语言:javascript
复制
Rscript -e "library(randtoolbox);set.generator('MersenneTwister',initialization='init2002',resolution=53,seed=42);runif(10)"
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-09 22:53:55

它是随机工具箱中的一个bug :C代码不使用宽度基整数类型(如uint32_t ),当intlong的宽度不同时(比如在Linux 64位上,而不是在Windows上),C代码有一些微妙的错误。例如,在文件mt19937ar.c中,将一个int分配给一个未签名的长,这将导致符号扩展名:

代码语言:javascript
复制
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];

如果将最后一行替换为:

代码语言:javascript
复制
        mt[i] = state[i+1] & 0xffffffffUL;

窃听器消失了。

只需下载源代码、解压缩、修补并执行:

代码语言:javascript
复制
R CMD INSTALL randtoolbox

在包父目录中。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56957642

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档