加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 确定牌组洗牌的程度

发布时间:2020-12-16 00:09:42 所属栏目:百科 来源:网络整理
导读:我正在做一个小型扑克计划,我想确定一个牌组的洗牌程度. 我有一张带有52张牌的List然后我运行我的洗牌算法,我希望能够确定牌组在某种程度上的洗牌程度. 有人知道怎么做吗? 谢谢 编辑: 哇.很多回复.一切都很好,但不完全是我想要的.这是我没有进一步指出我的
我正在做一个小型扑克计划,我想确定一个牌组的洗牌程度.
我有一张带有52张牌的List然后我运行我的洗牌算法,我希望能够确定牌组在某种程度上的洗牌程度.
有人知道怎么做吗?
谢谢

编辑:
哇.很多回复.一切都很好,但不完全是我想要的.这是我没有进一步指出我的问题的错.但我认为Saran最接近我真正想要的.我来说明一下.

我不想马上进行“完美”的洗牌.我已经读完了,我实施了Fisher-Yates.那个人很擅长“完美”的洗牌.我想要做的是模拟一个真实世界的情况,朋友们正在玩德州扑克,经销商拿着套牌并使用混合其他洗牌的浅滩洗牌来洗牌.
最后,我想要的是一种衡量现实世界洗牌之间差异的方法.

一个例子.假设牌组总是新鲜的(对于所有四件套装来说,王牌适合王牌,然后是王牌王牌.)乔拿着甲板,做了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 shuffle方法5次我得到
5,7,11,7.

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

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

解决方法

对此的一个想法是获取列表并用整数值填充它(每卡1个int).制作另一组带有int值的代码并将其转换为卡片值,这样您就可以保留哪些卡属于哪些卡片.随机化整数列表,然后循环遍历列表中的每一行,并标记一组范围内的数量或前一数字中1-2个整数的一个范围.然后,然后为穷人,好人,好人等设置一套百分比表…

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读