C ++随机生成器中是否有错误?

时间:2015-02-16 00:46:54

标签: c++ random

我在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。

我找不到任何可能出错的地方,所以如果你试图调查,请提前感谢:)

1 个答案:

答案 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的文件风格非常糟糕。