我必须使用现已退休的员工生成的一些代码,并且我对随机数有一些奇怪的事情。在某些时候,他将PRNG 10位返回的值向右移动,然后在该值上使用掩码。
我已经在互联网上看到一些PRNG的随机性很差,它们产生的数字有一些比特(就像最后一个,只是在1和0之间交替),但是如果存在一些照明,我已经搜索过了。关于Mersenne Twister的这些问题,但我还没有发现任何问题。有谁知道这件事?
答案 0 :(得分:1)
通常情况下,任何一点都应该是随机的,这是Mersenne twister的属性。
然而(我不太了解MT)你可能在某些位之间存在长期依赖关系。 建议使用库函数来设置整数范围,而不是自己排列这些位,或者你永远不知道它可能得到的复杂属性。
如果使用c ++ 11标准库,只需将std :: mt19937与std :: uniform_int_distribution一起使用
答案 1 :(得分:-1)
我对Mersenne Twister尤其不确定,但我想到的是在尝试获得[0,n]范围内的随机整数时得到的典型建议。如果PRNG返回的整数范围大于n,则不应使用modulo来缩小范围,如
x = rand() % n;
但应该重新调整数字
x = (int) floor(((double) rand()) / ((double) RAND_MAX)) * n);
代替。原因是伪随机数的最高有效位通常比较小位更随机,因此虽然模运算保持良好且无浮点,但它也丢弃了那些宝贵的有效位。
虽然我不知道你提到的代码试图做什么,但可能是向右移位加屏蔽可能是以丢弃最低有效位的方式减小随机数的范围。