我正在做一个小型扑克程序,我想确定一副牌的洗牌效果。
我有一个包含 52 张牌的列表,然后我运行我的洗牌算法,我希望能够确定牌组在一定程度上洗牌的程度。
有人知道如何做到这一点吗?
谢谢

编辑:
哇。很多回应。一切都很好,但不完全是我想要的。那是我没有进一步说明我的问题的错。但我认为 Saran 最接近我真正想要的。让我指定。

我不想立即进行“完美”的洗牌。我已经阅读了这一点,并实现了 Fisher-Yates。那个非常擅长提供“完美”的洗牌。我试图做的是模拟一个真实世界的情况, friend 们在玩德州扑克,庄家拿走牌并使用 riffle shuffle 与其他 shuffle 混合的方式对其进行洗牌。
最后,我想要的是一种衡量现实世界洗牌之间差异的方法。

一个例子。假设牌组总是新鲜的(A 到 K 花色,然后下一个花色 A 到 K 的所有四套花色)。乔拿起甲板并进行 2 次浅滩洗牌,中间有一个切口。彼得做了 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。

这些结果非常符合我的预期。

如果有人能发现这种方法有问题,那么如果您能发表评论,我将不胜感激:)
谢谢

最佳答案

一个想法是获取列表并用整数值填充它(每张卡 1 个整数)。制作另一组代码,获取 int 值并将其转换为您的卡值,这样您就可以保留哪些卡属于哪些数字。随机化整数列表,然后循环遍历列表中的每一行并标记有多少在一组范围内或前一个数字的 1-2 个整数范围内。最后,您可以为“差”、“好”、“好”等设置一组百分比刻度……

这可能不是最好的解决方案,但您将能够了解列表的分布情况。

关于c# - 确定牌组洗牌的程度,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19434884/

10-09 08:26