gpt4 book ai didi

c++ - 用于洗牌的好 RNG

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:23:28 25 4
gpt4 key购买 nike

现在我正在使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com