费雪-耶茨在牌单上乱晃
本文关键字:费雪 | 更新日期: 2023-09-27 18:23:51
我正在尝试在一张牌列表上进行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
. . .
谢谢你的帮助。
逻辑肯定是完全一样的吗?唯一不同的是,您正在从您的收藏中读取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,仍然基于int),我会这样做:
-
将构造函数添加到采用
int
的卡类中。将一副牌的52张牌映射到数字0-51是非常容易的,所以我把它留给你注意:如果你将套装映射到0-3,而不是你选择的看似随机的数字,这将变得更容易。 -
使用for循环创建一个起始牌组,生成所有52张牌。
-
在这个创建的列表上运行shuffle。