c# - 为什么我的卡代码显示重复卡?
问题描述
我正在为纸牌创建一个程序。它工作正常,但我得到的唯一错误是它显示重复的卡片 - 没有卡片应该显示两次。大家建议的都试过了。基本上这对我来说是全新的,你所说的所有高级方法还没有被教授过。还搜索并寻找了所有可用于纸牌的解决方案,但无济于事。
namespace DeckofCards
{
class Program
{
static void Main(string[] args)
{
Console.Title = "DECKOFCARDS";
String UI = "";
while (UI.ToUpper() != "Q")
{
Console.Clear();
Console.WriteLine("Please Press Q to Quit");
UI = Console.ReadLine();
if (UI.ToUpper() == "Q")
{
break;
}
List<String> Faces = new List<string>();
List<String> Suits = new List<string>();
Faces.Add("Ace");
Faces.Add("1");
Faces.Add("2");
Faces.Add("3");
Faces.Add("4");
Faces.Add("5");
Faces.Add("6");
Faces.Add("7");
Faces.Add("8");
Faces.Add("9");
Faces.Add("10");
Faces.Add("Jack");
Faces.Add("Queen");
Faces.Add("King");
Suits.Add("Hearts");
Suits.Add("Spades");
Suits.Add("Clubs");
Suits.Add("Diamonds");
Console.WriteLine("How many cards do you want.?");
string Input = Console.ReadLine();
int NumberOfCards = 0;
Random RanFaces = new Random();
Random RanSuits = new Random();
{
if (int.TryParse(Input, out (NumberOfCards))) // to handle incorrect (alphabetic) inputs
if (NumberOfCards <= 52 && NumberOfCards > 0)
{
for (int Output = 0; Output < NumberOfCards; ++Output)
{
int RandomFaces = RanFaces.Next(0, 12);
int RandomSuits = RanSuits.Next(0, 3);
Console.WriteLine("Your Cards are {0} of {1}", Faces[RandomFaces], Suits[RandomSuits]);
if ((Output + 1) % 4 == 0)
Console.WriteLine();
}
}
else
{
Console.WriteLine("This is not a Valid number of cards.");
}
else
{
Console.WriteLine("This is not a Valid number of cards.");
}
Console.ReadLine();
}
}
}
}
}
解决方案
执行此操作的标准方法是首先创建所有 52 张可能的牌的“牌组”,每张牌按顺序出现一次。“甲板”只是一些有序的结构,如数组。
然后,您通过遍历牌组中的每个位置并将该位置的牌与牌组中随机位置(可能是其本身)的另一张牌交换来“洗牌”该牌组。然后,这确保了卡片的顺序是随机的,并且每张卡片出现一次且仅出现一次。
它并不为人所知,但这种幼稚的方法存在一个错误:如果您将每张卡片随机交换到任何其他位置,则卡片的最终分布并不是完全随机的。对此的解决方法是仅将每个牌位轮流交换为等于或大于其当前位置的牌位。(这称为Fisher-Yates Shuffle)
推荐阅读
- postgresql - 如何将证书附加到我的本地 Rest API 以连接到 Google Cloud 中的 Postgres 数据库?
- php - 使用 bind_param 从 mysql 中选择两个表
- r - 如何在 ggplot 中引用管道对象?
- bash - 我正在尝试编写 S3 Bash 脚本以便能够在其中传递存储桶名称和对象以便能够在本地下载
- javascript - 如何以角度合并两个相同值的javascript对象?
- python - 如何根据groupby总结数据框中的行值?
- java - 如何在 Visual Studio Code 中的 java 项目中制作包
- javascript - 允许代理服务器接受随机数路由
- python - 如何在 shell/Python 和网页之间交换数据?
- sql - 根据参数 SQL ORACLE 生成范围之间的日期