【发布时间】:2014-09-12 22:55:26
【问题描述】:
首先我在这里有我的“甲板”课程。我刚刚放入了一些基本方法,用于测试目的。这是我第一次尝试创建“卡片”程序。
public class Deck
{
private int deckCounter = 0;
private List<Card> deckSize = new List<Card>();
private List<Card> shuffledDeck = new List<Card>();
private Random random = new Random();
public Deck()
{
}
public void Build()
{
for (int i = 1; i < 5; i++)
{
for (int k = 1; k < 14; k++)
{
deckSize.Add(new Card(k.ToString(), i));
}
}
}
public void Add(Card card)
{
deckSize.Add(card);
deckCounter++;
}
public Card RemoveCard()
{
Card cardToRemove = deckSize.First();
deckSize.RemoveAt(0);
return cardToRemove;
}
public void ShowContainedCards()
{
int cardCount = 0;
foreach (Card c in deckSize)
{
Console.WriteLine(c.ReturnCardInfo());
cardCount++;
}
Console.WriteLine(cardCount);
}
public void Shuffle()
{
while (deckSize.Count != 0)
{
int i = random.Next(deckSize.Count);
shuffledDeck.Add(deckSize[i]);
deckSize.RemoveAt(i);
}
deckSize = shuffledDeck;
}
public bool IsEmpty()
{
if (deckSize.Any())
{
return false;
}
else return true;
}
public List<Card> GetCardList()
{
return deckSize;
}
}
基本上,我所做的是:
Deck deck1 = new Deck();
Deck deck2 = new Deck();
deck1.Build();
deck1.Shuffle();
deck2.Build();
deck2.Shuffle();
在那之后,我得到了完全相同的洗牌,甲板 1 和甲板 2。这是为什么?另外,我是这方面的新手,如果你不知道的话:)
【问题讨论】:
-
它说in the documentation for Random:“通过调用默认构造函数连续创建的不同 Random 对象将具有相同的默认种子值,因此将产生相同的随机数集。”
-
附带说明,请参阅Fisher-Yates shuffle,这是一种正确的随机播放算法。
-
已关闭,因为根本问题是相同的,并且现有问题很好地解释了它。
-
您的
Shuffle例程也不是很安全 - 我会将shuffledDeck设为局部变量而不是字段,并始终在 Shuffle 中使用新的List<>对其进行初始化。目前,您不能以理智的方式调用两次Shuffle,因为在第一次调用之后,deckSize和shuffledDeck引用的是同一个列表。