c++ - 用于洗牌的好 RNG

标签 c++ random

现在我正在使用 Mersenne Twister RNG 并执行 Fisher-Yates 洗牌算法 100 次:

    std::vector<Card> shufCards;
    for(int i = 0; i < 4; ++i)
    {
        for(int j = 0; j < 13; ++j)
        {

            shufCards.push_back(Card((Card::SuitEnum)i,(Card::RankEnum)j));
        }
    }
    for(int r = 0; r < 100; ++r)
    for(int i = shufCards.size() - 1; i >= 1; i--)
    {
        int j = m_randomGenerator.genrand_int31() % (i + 1);
        std::swap(shufCards[i],shufCards[j]);
    }

    std::vector<Card> cards;
    for(int i = 0; i < zeroBasedCut; ++i)
    {
        cards.push_back(shufCards[i]);
    }

    for(int i = zeroBasedCut; i < 52; ++i)
    {
        cards.push_back(shufCards[i]);
    }


    return cards;

但感觉每套花色的牌数有点偏差,而且有点可预测。一手 13 张牌只有 1 张红桃和 5 张黑桃的可能性很小,但这种情况经常发生。

我可以为此使用什么更好的 RNG?

谢谢

最佳答案

众所周知,我们对随机性的感知很差。如果您怀疑您的例程在某种程度上存在偏差,我建议您使用您的例程进行大量随机试验,然后查看各种手牌分布的实际概率,并将它们与理论上的预期进行比较。

除此之外,我还有一些观察结果:

  1. 为什么要洗牌多次?一次通过就可以完成同样的工作。
  2. zeroBasedCut 的目的是什么?它实现了哪些 Fisher-Yates 没有实现的目标?
  3. 为什么不使用 std::random_shuffle 而不是您自己的例程?

关于c++ - 用于洗牌的好 RNG,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7500890/

相关文章:

arrays - 在 Forth 中设置数组元素的问题

r - 为什么 'load()' 函数后的随机状态相同

c++ - 确定是否在不设置全局变量的情况下调用了函数

c++ - 使用静态 vector 时 _Orphan_range 崩溃

java - 如何获得唯一的随机整数?

javascript - 如何定位我随机创建的 ID

c++ - 一个好的随机数生成器的想法是什么?

c++ - 佳能 SDK - 下载图像到主机 PC

c++ - inline void addTask(Task task) vs inline void addTask(const Task &task)

c++ - 它是一个 gdb 错误吗?