我正在做一个小型扑克程序,我想确定一副牌的洗牌程度。我有一个包含 52 张牌的列表,然后我运行我的洗牌算法,我希望能够确定牌组在某种规模上洗牌的效果。有人知道如何做到这一点吗?谢谢
编辑:哇。很多回应。一切都很好,但不完全是我想要的。这是我没有进一步说明我的问题的错。但我认为萨兰最接近我真正想要的。让我具体说明。
我不想要一个“完美”的洗牌马上。我已经阅读了这一点,并实现了 Fisher-Yates。那个非常擅长提供“完美”的洗牌。我正在尝试做的是模拟一个真实世界的情况,朋友们正在玩德州扑克,庄家拿走牌组并使用 riffle shuffle 与其他洗牌混合进行洗牌。最后,我想要的是一种衡量现实世界洗牌之间差异的方法。
一个例子。假设这副牌总是新鲜的(A 到 K 同花色,然后下一个花色 A 到 K 全部四种花色)。乔拿起牌组,做了 2 次洗牌,中间有 1 次。彼得做了 5 次剥离洗牌。我想找到一种方法来查看哪个“更好”地洗牌。
我想得越多,我就越觉得这很难确定。
再次感谢。
编辑 23.10.2013
这是我想出的方法,将 Sarans 的想法与我的想法结合起来:
public int checkShuffle(List<Card> cardDeckToCheck,int[] previousOrder)
{
// Higher is worse? Sure.
int score = 0;
for (int i = 0; i < cardDeckToCheck.Count; i++)
{
Card cardToCheck = cardDeckToCheck[i];
Card cardToLeft = null;
Card cardToRight = null;
// Should cost more since the card has not moved at all.
// For this I need an array that shows me the arangement of the deck before shuffling.
if(cardToCheck.index == previousOrder[i])
{
score += 3;
}
if (i == 0)
{
Console.WriteLine("i == 1");
cardToRight = cardDeckToCheck[i+1];
// if the card we are checking is one lower or one higher than the card to the right
if(Math.Abs(cardToCheck.index - cardToRight.index) == 1)
{
score++;
}
continue;
}
else if (i == cardDeckToCheck.Count-1)
{
Console.WriteLine("i == carddecktocheck.count-1");
cardToLeft = cardDeckToCheck[i - 1];
// if the card we are checking is one lower or one higher than
if (Math.Abs(cardToCheck.index - cardToLeft.index) == 1)
{
score++;
}
continue;
}
else
{
cardToLeft = cardDeckToCheck[i - 1];
cardToRight = cardDeckToCheck[i + 1];
// if the card we are checking is one lower or one higher than
if (Math.Abs(cardToCheck.index - cardToLeft.index) == 1)
{
score++;
}
if (Math.Abs(cardToCheck.index - cardToRight.index) == 1)
{
score++;
}
continue;
}
}
return score;
}
我首先将牌组的外观记录到一个 int 数组中,然后将牌组洗牌,然后使用洗牌后的牌组和牌组的先前顺序运行此方法。像这样:
int[] previousOrder = getCurrentOrder(deck.getDeck());
deck.setDeck(riffleShuffle2(3));
textBoxShuffleness.Text = "" + checkShuffle(deck.getDeck(), previousOrder);
displayDeck(deck);
当我从未洗牌的牌组开始并运行 riffle shuffle 方法 5 次时,我得到 70、33、28、5、10。当我从未洗牌的牌组开始并运行 Durstenfeld 洗牌方法 5 次时,我得到 5,0,7,11,7。
这些结果非常符合我的预期。
如果有人能发现这种方法有问题,那么如果您能发表评论,我将不胜感激:)谢谢