3

基本上都在标题中。这很简单,但我不知道为什么我的 While 循环有时会失败。时不时我会得到一个长度为 2 而不是 3 的列表。

这是我的 C# 代码:

public List<int> generateRequiredSecretCode()
{
    List<int> placeHolder = new List<int>();
    Random random = new Random();
    int randomNo = random.Next(0, 10);
    while (!placeHolder.Contains(randomNo) && placeHolder.Count != 3)
    {
        placeHolder.Add(randomNo);
        randomNo = random.Next(0, 10);
    }
    return placeHolder;
}

我的目标总结:我想要一个长度为 3整数列表,列表中的每个数字都在 0 到 9 之间并且是唯一的

4

4 回答 4

7

您可以使用整洁的 LINQ 两线

var random = new Random();
return Enumerable.Range(0,10).OrderBy(i => random.NextDouble()).Take(3).ToList();
于 2013-01-18T11:48:35.037 回答
3

!placeHolder.Contains(randomNo)是您的问题,因为如果列表包含 randomNo,则 while 结束。!placeHolder.Contains(randomNo)如果像这样在内部检查:

while (placeHolder.Count != 3)
{
    if( !placeHolder.Contains(randomNo) )
      placeHolder.Add(randomNo);
    randomNo = random.Next(0, 10);
}
于 2013-01-18T11:44:47.070 回答
0

它有时会失败,因为在极少数情况下,当 Rand.Next 确实向列表中的 thise 返回相同的数字时,!placeHolder.Contains(randomNo)将返回 false;false && any = false,所以循环结束。如果你运行它足够长的时间,你最终会得到一个长度为 1 的列表;)

可能的替换:

List<int> placeHolder = new List<int>();
Random random = new Random();
int randomNo;
do {
    randomNo = random.Next(0, 10);
    if (!placeHolder.Contains(randomNo) && placeHolder.Count != 3)
    {
         placeHolder.Add(randomNo);
         randomNo = random.Next(0, 10);
    }
} while (placeHolder.Count < 3);
return placeHolder;

[编辑]:这个线程移动得很快......而且Animal的解决方案比我的要好得多:(

于 2013-01-18T11:50:39.050 回答
0

聚会有点晚了,但集合算术看起来很优雅,所以忍不住:

private static Random RNG = new Random();

...

public static List<int> RandomNumbers() {
  var numbers = new HashSet<int> { RNG.Next(0, 9), RNG.Next(0, 9), RNG.Next(0, 9) };
  while (numbers.Count < 3) 
  {
    numbers.Add(RNG.Next(0, 9));
  }

  return numbers.ToList();
}
于 2013-01-18T12:06:56.947 回答