C 从Mersenne捻线器获得的数字中只取几位是否安全

C 从Mersenne捻线器获得的数字中只取几位是否安全,c,random,prng,mersenne-twister,C,Random,Prng,Mersenne Twister,我必须处理一个退休员工产生的代码,我有一些关于随机数的奇怪事情。在某些情况下,他将PRNG返回的值向右移位10位,然后在此值上使用掩码 我已经在互联网上看到一些PRNG的随机性很差,它们生成的数字中有一些位(比如最后一个,只是在1和0之间交替),但是我搜索了Mersenne Twister上是否存在这样的问题,但我没有发现任何问题。有人知道这件事吗?通常,任何比特都应该是随机的,这是梅森扭转器的特性 然而(我对机器翻译不太了解)在某些位之间可能存在长期依赖性。 建议使用库函数设置整数范围,而不是

我必须处理一个退休员工产生的代码,我有一些关于随机数的奇怪事情。在某些情况下,他将PRNG返回的值向右移位10位,然后在此值上使用掩码


我已经在互联网上看到一些PRNG的随机性很差,它们生成的数字中有一些位(比如最后一个,只是在1和0之间交替),但是我搜索了Mersenne Twister上是否存在这样的问题,但我没有发现任何问题。有人知道这件事吗?

通常,任何比特都应该是随机的,这是梅森扭转器的特性

然而(我对机器翻译不太了解)在某些位之间可能存在长期依赖性。 建议使用库函数设置整数范围,而不是自己安排位,否则您永远不知道它可能得到的复杂属性


如果您使用c++11标准库,只需将std::mt19937与std::uniform_int_distribution一起使用

我不确定Mersenne Twister是否特别适用,但我想到的是在尝试获取范围内的随机整数时得到的典型建议[0,n)。如果您有一个PRNG返回的整数的范围大于n,则不应使用模来缩小范围,如

x = rand() % n;
但是应该重新调整数字

x = (int) floor(((double) rand()) / ((double) RAND_MAX)) * n);
相反,原因是伪随机数的最高有效位通常比较低的位更随机,因此,尽管模运算保持了良好和无浮点,但它也丢弃了那些宝贵的有效位


虽然我不知道您提到的代码试图做什么,但可能是右移加掩蔽可以减少随机数的范围,从而丢弃最低有效位。

我猜他知道他使用的PRNG在前几位的随机性较差,所以他将that number在数字的“最随机”位上使用掩码。但不幸的是,这只是一个猜测。这只适用于绝对糟糕的PRNG(通常是
rand()
)。但是,正确的选择是迁移到更好的PRNG,而不是打磨垃圾。即使像Mersenne Twister这样平庸的PRNG,这也不是问题。我只是想帮助回答一个问题。问题是关于
C
和其他退休员工,PRNG可能不是最好的假设是正确的。考虑到关于更新/编写新代码的建议,我只建议使用像GSL.DV这样的库:使用
x=rand()%n;
x
。但是使用
x=(int)floor(((double)rand())/((double)rand_MAX))*n);
x此代码的主要目的是生成高斯噪声,因此rau取自瑞利表,索引是移位和掩码数,而teta取自相同的随机数,但这次只进行了掩码,而不是移位。在c++11中,声明干净的高斯生成器需要两行代码。如果c++11是一个选项,请重新编译g所有旧的、不防故障的、由STL ones定制的生成器可能是一个不错的选择。很好观看:谢谢,出于好奇,我将观看,但我们必须将其保存在C中。已经决定,在不知道其背后的想法的情况下保存这些东西不是一件好事。因此,我必须对其进行修改并编写一些文档为了避免将来出现这种情况,我很高兴。谢谢大家的回答。