首页 > 解决方案 > 为什么我的卡代码显示重复卡?

问题描述

我正在为纸牌创建一个程序。它工作正常,但我得到的唯一错误是它显示重复的卡片 - 没有卡片应该显示两次。大家建议的都试过了。基本上这对我来说是全新的,你所说的所有高级方法还没有被教授过。还搜索并寻找了所有可用于纸牌的解决方案,但无济于事。

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();
                }
            }
        }
    }
}

标签: c#

解决方案


执行此操作的标准方法是首先创建所有 52 张可能的牌的“牌组”,每张牌按顺序出现一次。“甲板”只是一些有序的结构,如数组。

然后,您通过遍历牌组中的每个位置并将该位置的牌与牌组中随机位置(可能是其本身)的另一张牌交换来“洗牌”该牌组。然后,这确保了卡片的顺序是随机的,并且每张卡片出现一次且仅出现一次。

它并不为人所知,但这种幼稚的方法存在一个错误:如果您将每张卡片随机交换到任何其他位置,则卡片的最终分布并不是完全随机的。对此的解决方法是仅将每个牌位轮流交换为等于或大于其当前位置的牌位。(这称为Fisher-Yates Shuffle


推荐阅读