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 扩展名的文件是非常糟糕的风格。