考虑kaarten
是一个List
代表卡片的东西......
public void Shuffle()
{
// Insert cards at random order into the shuffled list
var shuffled = new List<Card>();
var rand = new Random();
// As long as there are any cards left to insert randomly
while (kaarten.Count != 0)
{
// Get the index of the random card to insert
var i = rand.Next(kaarten.Count);
// Insert it
shuffled.Add(kaarten[i]);
// Remove from non-shuffled list
kaarten.RemoveAt(i);
}
// Set the list of cards to the shuffled list
kaarten = shuffled;
}
您当前代码的问题:
您不会将随机数保存到局部变量中,因此当您尝试交换它们时,您实际上有 4 个随机数,而不是 2 个随机数。
此外,为了交换数组中的两个元素,您应该使用 tmp 变量,就像在 Swap 算法中所见的那样,几乎可以在您看到的任何地方看到。
然而,对于一个完整的洗牌,我的方法不需要决定循环交换多少次以获得足够的洗牌,因此更有效也更容易理解。
还有另一种打乱列表的方法,如果您愿意,这有点令人困惑(效率最低)但更短:
var rand = new Random();
kaarten = kaarten.Select(x => new{X=x,R=rand.Next()})
.OrderBy(x => x.R)
.Select(x => x.X)
.ToList();
//.ToArray(); if kaarten is an array and not a list