费雪耶茨洗牌卡列表

我正试图将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 { 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 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 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 . . . 

感谢您的帮助。

当然逻辑是完全一样的吗? 唯一不同的是你从你的collections中读取一张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; } 

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

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

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

  2. 使用for循环创建一个起始“deck”以生成所有52张牌。

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