C++ 随机生成器中有错误吗?
Is there a bug in the C++ random generator?
我在https://github.com/lub094/Roulette写了一个小程序。它模拟轮盘赌并计算已达到长度为 n 的相同颜色扇区序列的次数。因此,如果你旋转它 4 次,你得到红色、黑色、黑色、黑色,这将为你提供 2 个长度为 1 的序列,以及 1 个长度为 2 和 3 的序列。
当我旋转它超过一百万次时,问题就来了。然后达到的最长序列绝对总是 15。我试过 500 000 000 000 次旋转,最长序列是 15。我已经计算过,我已经在 java 上试过了,并且这似乎是一种异常行为。我试过将种子 srand() 放在 main、Roulette class 的构造函数和调用 rand() 的方法中,但似乎没有区别。
这就是我目前播种兰特的方式:
#include <iostream>
#include "Roulette.cpp"
int main() {
srand(time(nullptr));
Roulette roulette;
roulette.spin(10000000);
return 0;
}
在 class 轮盘赌中,我有 getRandomColor() 方法,我在其中调用了 rand() 方法:
SectorColor getRandomColor() {
long long randomNumber = rand();
if (randomNumber % 2 == 0) {
return SectorColor::RED;
} else {
return SectorColor::BLACK;
}
}
我 运行 在 MinGW 的最新版本上 windows 就此日期而言。 IDE 我使用的是 Eclipse。
我找不到任何可能有错误的地方,如果您尝试调查,请提前致谢:)
你的问题就在这里:
if (randomNumber % 2 == 0) {
return SectorColor::RED;
} else {
return SectorColor::BLACK;
}
众所周知,rand()
的许多实现都有 very poor randomness in the lower bits。尝试类似的东西:
return (randomNumber & 1024)? SectorColor::BLACK : SectorColor::RED;
它使用位 10 而不是位 0。
转向基于 C++ 模板的 PRNG,例如 Mersenne Twister,会更好。
旁注,命名包含具有 .cpp 扩展名的文件是非常糟糕的风格。
我在https://github.com/lub094/Roulette写了一个小程序。它模拟轮盘赌并计算已达到长度为 n 的相同颜色扇区序列的次数。因此,如果你旋转它 4 次,你得到红色、黑色、黑色、黑色,这将为你提供 2 个长度为 1 的序列,以及 1 个长度为 2 和 3 的序列。
当我旋转它超过一百万次时,问题就来了。然后达到的最长序列绝对总是 15。我试过 500 000 000 000 次旋转,最长序列是 15。我已经计算过,我已经在 java 上试过了,并且这似乎是一种异常行为。我试过将种子 srand() 放在 main、Roulette class 的构造函数和调用 rand() 的方法中,但似乎没有区别。
这就是我目前播种兰特的方式:
#include <iostream>
#include "Roulette.cpp"
int main() {
srand(time(nullptr));
Roulette roulette;
roulette.spin(10000000);
return 0;
}
在 class 轮盘赌中,我有 getRandomColor() 方法,我在其中调用了 rand() 方法:
SectorColor getRandomColor() {
long long randomNumber = rand();
if (randomNumber % 2 == 0) {
return SectorColor::RED;
} else {
return SectorColor::BLACK;
}
}
我 运行 在 MinGW 的最新版本上 windows 就此日期而言。 IDE 我使用的是 Eclipse。
我找不到任何可能有错误的地方,如果您尝试调查,请提前致谢:)
你的问题就在这里:
if (randomNumber % 2 == 0) {
return SectorColor::RED;
} else {
return SectorColor::BLACK;
}
众所周知,rand()
的许多实现都有 very poor randomness in the lower bits。尝试类似的东西:
return (randomNumber & 1024)? SectorColor::BLACK : SectorColor::RED;
它使用位 10 而不是位 0。
转向基于 C++ 模板的 PRNG,例如 Mersenne Twister,会更好。
旁注,命名包含具有 .cpp 扩展名的文件是非常糟糕的风格。