现在我正在使用 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?
谢谢
最佳答案
众所周知,我们对随机性的感知很差。如果您怀疑您的例程在某种程度上存在偏差,我建议您使用您的例程进行大量随机试验,然后查看各种手牌分布的实际概率,并将它们与理论上的预期进行比较。
除此之外,我还有一些观察结果:
- 为什么要洗牌多次?一次通过就可以完成同样的工作。
zeroBasedCut
的目的是什么?它实现了哪些 Fisher-Yates 没有实现的目标?- 为什么不使用
std::random_shuffle
而不是您自己的例程?
关于c++ - 用于洗牌的好 RNG,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7500890/