首页 > 后端开发 > C++ > 如何在 C# 中根据用户指定的洗牌方式有效地洗一副牌?

如何在 C# 中根据用户指定的洗牌方式有效地洗一副牌?

Linda Hamilton
发布: 2025-01-03 13:10:38
原创
290 人浏览过

How can I efficiently shuffle a deck of cards in C# based on user-specified shuffles?

C# 中的洗牌

常见的编程练习涉及用给定语言编写洗牌模拟。此问题探讨洗牌一副牌并询问用户洗牌的次数。

问题陈述

提供的代码包括一副牌、牌和牌的类套装,以及一个显示初始纸牌顺序并接受用户输入洗牌次数的程序。挑战在于实现混洗机制。

解决方案

Fisher-Yates shuffle,也称为 Knuth shuffle,是一种广泛使用的数组混洗算法就位。更新后的代码合并了以下算法:

static public class FisherYates<br>{<pre class="brush:php;toolbar:false">static Random r = new Random();
登录后复制

;  static public void Shuffle(Card[] Deck)<pre class="brush:php;toolbar:false">{
    for (int n = deck.Length - 1; n > 0; --n)
    {
        int k = r.Next(n+1);
        Card temp = deck[n];
        deck[n] = deck[k];
        deck[k] = temp;
    }
}
登录后复制

}

这个类定义了一个静态方法 Shuffle,它将卡片数组作为输入。然后,它以相反的顺序遍历牌组,选择随机一张牌与当前牌交换。通过迭代整个牌组,该算法确保彻底混合。

实现

要将 shuffle 合并到原始代码中,请在以下代码中添加对 Shuffle 方法的调用从用户处获取洗牌次数后的Program类的Main方法:

Deck myDeck =新甲板(); // 创建一个新牌组<br>int numShuffles = Int32.Parse(Console.ReadLine()); // 读取所需洗牌的用户输入<br>FisherYates.Shuffle(myDeck.Cards); // 将牌组洗牌所需的次数<br>foreach (Card c in myDeck.Cards) // 打印洗牌后的牌组<br>{<pre class="brush:php;toolbar:false">Console.WriteLine(c);
登录后复制

}

结论

结合Fisher-Yates 洗牌算法可实现纸牌的高效洗牌,并满足用户指定洗牌次数的要求。代码按照要求输出洗牌后的牌组。

以上是如何在 C# 中根据用户指定的洗牌方式有效地洗一副牌?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板