我在https://github.com/lub094/Roulette写了一个小程序。它模拟轮盘赌并计算已经达到长度为n的相同颜色扇区序列的时间。因此,如果你旋转它4次,你会得到RED,BLACK,BLACK,BLACK,它会给你2个长度为1的序列,以及1个长度为2和3的序列。
当我旋转它超过一百万次时出现问题。然后达到的最长序列绝对是15。我已经尝试了500亿次旋转再次,最长的序列是15.我已经完成了数学计算,我已经在java上尝试过了,这似乎是一种异常行为。我已经尝试将种子srand()放在main中,在Roulette类的构造函数中以及调用rand()的方法中,但似乎没有区别。
这就是我目前播种兰特的方式:
#include <iostream>
#include "Roulette.cpp"
int main() {
srand(time(nullptr));
Roulette roulette;
roulette.spin(10000000);
return 0;
}
在Roulette类中,我有方法getRandomColor(),我调用rand()方法:
SectorColor getRandomColor() {
long long randomNumber = rand();
if (randomNumber % 2 == 0) {
return SectorColor::RED;
} else {
return SectorColor::BLACK;
}
}
我在MinGW最新版本的Windows上运行此日期。我正在使用的IDE是Eclipse。
我找不到任何可能出错的地方,所以如果你试图调查,请提前感谢:)
答案 0 :(得分:3)
你的问题就在这里:
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的文件风格非常糟糕。