如何随机播放List

我发现维基百科上的这段Java代码应该在适当的位置改组:

public static void shuffle (int[] array) { Random rng = new Random(); int n = array.length; while (n > 1) { n--; int k = rng.nextInt(n + 1); int tmp = array[k]; array[k] = array[n]; array[n] = tmp; } } 

虽然我没有测试代码,但它看起来应该可以正常使用数组。 在我的C#项目中,我创建了一个CardSet类,并在Shuffle()方法中使用了上面的代码:

 public class CardSet { private List cards; public Card this[int i] { get { return cards[i]; } set { cards[i] = value; } } public void Shuffle() { Random rng = new Random(); int n = this.NumberOfCards; while (n < 1) { n--; int k = rng.Next(n + 1); Card tmp = this[k]; this[k] = this[n]; this[n] = tmp; } } 

但是,当我使用该方法时,不会发生改组:

 CardSet cs = new CardSet(); cs.Shuffle(); foreach (Card c in cs) { Console.WriteLine(c.ToString()); } 

我只是想不通为什么它不起作用。 我认为List可能会自动对其对象进行排序,所以我尝试更改其中一个值,

 cs[8] = new Card(Suites.Hearts, Numbers.Two); 

Card就是我放的地方。 要么我犯了一些简单的错误,要么我没有正确地编写洗牌算法。 如果我提供的代码看起来很好并且有人认为错误可能在我的代码中的其他地方,我可以提供其余的代码。

更改

 while (n < 1) 

 while (n > 1) 

使用GUID查看LINQ和orderby

你的while循环关闭了。 它表示当n小于1.您将n设置为卡的数量。 所以说如果你有52张牌肯定大于1并且你的循环没有执行。

所以改变你的while循环看起来像这样:

 while(n > 1) 

示例方法中的代码和应用程​​序中的代码(第一个和第二个块)是不同的。 在一个,你使用

 While (n < 1) 

在另一个你用

 While (n > 1) 

正确使用的是您的样本 - “(n> 1)”。 如果你使用另一个,你的循环甚至不会执行一次 - 它跳过条件而你的套牌保持不变。

也就是说,LINQ是一个更好的选择,如果你可以使用它。