我在Wikipedia发现了一段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<Card> 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
正是我所说的。要么我犯了一些简单的错误,要么我没有正确地编写洗牌算法。如果我提供的代码看起来很好并且有人认为我的代码中的其他地方可能存在错误,那么我可以提供其余的代码。
答案 0 :(得分:16)
更改
while (n < 1)
到
while (n > 1)
答案 1 :(得分:3)
答案 2 :(得分:2)
您的while循环已关闭。它表示当n小于1.你将n设置为卡的数量。所以说如果你有52张牌肯定大于1而且你的循环没有执行。
所以改变你的while循环看起来像这样:
while(n > 1)
答案 3 :(得分:1)
示例方法中的代码和应用程序中的代码(第一个和第二个块)是不同的。在一个中,您使用
While (n < 1)
另一方面你使用
While (n > 1)
正确使用的是您的样本 - “(n> 1)”。如果你使用另一个,你的循环甚至不会执行一次 - 它跳过条件而你的套牌保持不变。
也就是说,如果可以使用LINQ,那么它是更好的选择。