费雪耶茨洗牌卡列表

时间:2014-09-19 22:33:47

标签: c# shuffle

我正试图将Fisher Yates洗牌放在一张牌上。我已经搜索了论坛,Fisher Yates的唯一实现是使用普通的int数组,如下面的

for (int i = length - 1; i > 0; i--)
{
  int j = random.Next(i + 1);
  int temp = array[i];
  array[i] = array[j];
  array[j] = temp;
}

哪个很有道理,我的麻烦是我真的没有看到如何将这种逻辑转换为我拥有的东西,任何帮助实现这一点都将非常感激。相关代码如下:

public struct Card : IComparable<Card>
{
  public Rank Rank { get; private set; }
  public Suit Suit { get; private set; }

  public Card(Rank rank, Suit suit) : this()
  {
    Rank = rank;
    Suit = suit;
  }

  public override string ToString()
  {
    return string.Format("{0:x} {1}", (char) Suit, Rank);
  }
}
public enum Suit { Spades = 9824, Clubs = 9827, Hearts = 9829, Diamonds = 9830 }
public enum Rank { Ace, Deuce, Three, Four, Five, Six, Seven, Eight, Nine, Ten, Jack, Queen, King }

public class Deck
{
  public List<Card> Cards { get; private set; }

  public Deck()
  {
    foreach (Rank rank in Enum.GetValues(typeof(Rank)))
    {
      foreach (Suit suit in Enum.GetValues(typeof(Suit)))
      {
        Card card = new Card(rank, suit);
        Cards.Add(card);
      }
    }
  }
  public Deck(List<Card> cardDeck)
  {
    Cards = cardDeck;
  }
  public void Shuffle()
  {  //???? I don't know how I would apply the Fisher Yates logic to here
     //since all other programs just use normal int arrays
  . . .

感谢您的帮助。

2 个答案:

答案 0 :(得分:5)

当然逻辑完全相同?唯一不同的是,您正在从您的收藏中读取Card而不是int,即

for (int i = Cards.Count - 1; i > 0; i--)
{
    int j = random.Next(i + 1);
    Card temp = Cards[i]; // Notice the change on this line
    Cards[i] = Cards[j];
    Cards[j] = temp;
}

在修复评论中提到的编程错误之后,这个实现似乎对我有用。

答案 1 :(得分:1)

之前实际上已经这样做了(虽然使用我自己的shuffle,仍然基于整数),我会这样做:

  1. 将构造函数添加到带有int的卡类中。很容易将牌组的52张牌映射到数字0-51,所以我会把它留给你。 注意:如果您将套装映射到0-3,而不是您选择的看似随机的数字,这将变得更容易批次

  2. 创建一个起始&#34;套牌&#34;使用for循环生成所有52张卡。

  3. 在此创建的列表中运行shuffle。