我必须使用现在退休的员工生成的一些代码,并且我对随机数有一些奇怪的事情。在某些时候,他将 PRNG 返回的值向右移动 10 位,然后对该值使用掩码。
我已经在互联网上看到一些 PRNG 的随机性很差,它们生成的数字中有一些位(如最后一个,只是在 1 和 0 之间交替),但我已经搜索过是否存在一些关于此类问题的垃圾Mersenne Twister,但我没有找到。有人知道吗?
我必须使用现在退休的员工生成的一些代码,并且我对随机数有一些奇怪的事情。在某些时候,他将 PRNG 返回的值向右移动 10 位,然后对该值使用掩码。
我已经在互联网上看到一些 PRNG 的随机性很差,它们生成的数字中有一些位(如最后一个,只是在 1 和 0 之间交替),但我已经搜索过是否存在一些关于此类问题的垃圾Mersenne Twister,但我没有找到。有人知道吗?
通常,任何位都应该是随机的,这是梅森捻线器的特性。
但是(我对 MT 的了解不是很深)您可能在某些位之间存在长期依赖关系。建议使用库函数来设置整数范围,而不是自己排列位,否则你永远不知道它可能得到的复杂属性。
如果您使用 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);
反而。原因是伪随机数的最高有效位通常比较低位更随机,因此虽然模运算保持良好且无浮点,但它也丢弃了那些宝贵的有效位。
虽然我不知道您提到的代码试图做什么,但可能是右移加掩码可能是以丢弃最低有效位的方式减少随机数的范围。