我看过很多人提出这个问题,但从未看到一个真正具体的答案。所以我要在这里发布一个帖子,希望能帮助人们理解为什么在使用随机数生成器(如C++中的rand()
)时会出现“模块偏差”。
我看过很多人提出这个问题,但从未看到一个真正具体的答案。所以我要在这里发布一个帖子,希望能帮助人们理解为什么在使用随机数生成器(如C++中的rand()
)时会出现“模块偏差”。
我刚刚编写了一段代码,用于 Von Neumann 的无偏硬币翻转方法,理论上应该消除任何随机数生成过程中的偏差。更多信息可以在(http://en.wikipedia.org/wiki/Fair_coin)找到。
int unbiased_random_bit() {
int x1, x2, prev;
prev = 2;
x1 = rand() % 2;
x2 = rand() % 2;
for (;; x1 = rand() % 2, x2 = rand() % 2)
{
if (x1 ^ x2) // 01 -> 1, or 10 -> 0.
{
return x2;
}
else if (x1 & x2)
{
if (!prev) // 0011
return 1;
else
prev = 1; // 1111 -> continue, bias unresolved
}
else
{
if (prev == 1)// 1100
return 0;
else // 0000 -> continue, bias unresolved
prev = 0;
}
}
}
rand() % 100
100次。B)如果所有结果都不同,则取第一个结果。C)否则,返回步骤A。这种方法可以使用,但预计需要约10^42次迭代,所以您需要非常耐心和长寿。 - Mark Ameryelse if(prev==2) prev= x1; else { if(prev!=x1) return prev; prev=2;}
- Rick