在C#中洗牌

13 .net c# shuffle playing-cards

我正在尝试为一个列出一副卡片内容的项目编写一个代码,询问该人想要洗牌的次数,然后将它们洗牌.它必须使用一个方法来使用System.Random类创建两个随机整数.

这些是我的课程:

Program.cs中:

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Deck mydeck = new Deck();
            foreach (Card c in mydeck.Cards)
            {
                Console.WriteLine(c);
            }
            Console.WriteLine("How Many Times Do You Want To Shuffle?");

        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Deck.cs:

namespace ConsoleApplication1
{
    class Deck
    {    
        Card[] cards = new Card[52];
        string[] numbers = new string[] { "2", "3", "4", "5", "6", "7", "8", "9", "J", "Q", "K" };
        public Deck()
        {
            int i = 0;
            foreach(string s in numbers)
            {
                cards[i] = new Card(Suits.Clubs, s);
                i++;

            }
            foreach (string s in numbers)
            {
                cards[i] = new Card(Suits.Spades, s);
                i++;

            }
            foreach (string s in numbers)
            {
                cards[i] = new Card(Suits.Hearts, s);
                i++;

            }
            foreach (string s in numbers)
            {
                cards[i] = new Card(Suits.Diamonds, s);
                i++;

            }
        }

        public Card[] Cards
        {
            get
            {
                return cards;


            }
        }
    }  
}
Run Code Online (Sandbox Code Playgroud)

Enums.cs:

namespace ConsoleApplication1
{        
    enum Suits 
    {
        Hearts,
        Diamonds,
        Spades,
        Clubs
    }
}
Run Code Online (Sandbox Code Playgroud)

Card.cs:

namespace ConsoleApplication1
{
    class Card
    {
        protected Suits suit;
        protected string cardvalue;
        public Card()
        {
        }
        public Card(Suits suit2, string cardvalue2)
        {
            suit = suit2;
            cardvalue = cardvalue2;
        }
        public override string ToString()
        {
            return string.Format("{0} of {1}", cardvalue, suit);
        }
    }
 }
Run Code Online (Sandbox Code Playgroud)

请告诉我如何使卡片尽可能多地随机播放,然后列出随机播放的卡片.

hug*_*own 48

使用Fisher-Yates shuffle.

您的C#代码应如下所示:

static public class FisherYates
{
    static Random r = new Random();
    //  Based on Java code from wikipedia:
    //  http://en.wikipedia.org/wiki/Fisher-Yates_shuffle
    static public void Shuffle(int[] deck)
    {
        for (int n = deck.Length - 1; n > 0; --n)
        {
            int k = r.Next(n+1);
            int temp = deck[n];
            deck[n] = deck[k];
            deck[k] = temp;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 费希尔耶茨?嗯,我不知道它有一个名字。我第一次实现它是在 Basic 中的 8 位 Atari 上!我想我当时是八年级。 (3认同)

Phi*_*ert 17

洗牌一副牌起初似乎微不足道,但通常大多数人想出的算法都是不正确的.

Jeff Atwood(Coding Horror)写了一些关于这个主题的非常好的文章:

http://www.codinghorror.com/blog/archives/001008.html

http://www.codinghorror.com/blog/archives/001015.html

(特别是第二个是必读的)

  • 您是在寻找某人为您编写代码还是告诉您如何操作?(假设这是一个作业,如果你自己写作,你将从课堂上获得更多.如果你不做任务,你通常会通过考试.) (8认同)

NoM*_*ots 5

我认为这是一个你可能只是陷入抽象的情况.

在软件中混洗一副牌是一个以随机顺序向用户提供牌组的问题.这实际上并不需要你提前洗牌.

开始你的套牌.(我通常使用1到52之间的数字来表示卡片并以数学方式计算哪张卡片.)

  1. 通过使用随机数生成器从卡片中取出卡片来处理卡片.
  2. 将卡片与卡片末端的卡片交换.
  3. 减少指向甲板末端的计数器,从甲板上取下该卡.
  4. 转到第1步,直到完成绘图卡.

编辑:一般来说,如果你有一个好的随机数发生器,通过多次"改组"就无法获得.

这应该可以使用您显示的数据结构.您只需要添加一个"Draw"方法和成员变量来跟踪卡组的结尾.如果你真的想要提前实际进行"洗牌",那么A你的教授是个混蛋,B你随时抽出52张牌就会被洗牌.一旦你绘制了所有卡片,你需要提供一个"DeckEmpty"方法,以及重置甲板结束以再次包含所有卡片的方法.