生成0到9之间三个唯一数字的最佳方法

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之间且是唯一的


1
抱歉,我只是忍不住:return new List {0,1,2};。再次抱歉,我的错。你想要随机数,我知道。=) - Jens
如果这是您唯一的标准,为什么要使用随机数生成器呢?{1,2,3}不符合所有三个要求吗? - Ash Burlaczenko
我已经在 LinqPad 中运行了这个程序 - 有时只会得到一个条目。 - Oded
@Jens 那确实是random - default
4个回答

7

使用LINQ,您可以编写简洁的两行代码:

var random = new Random();
return Enumerable.Range(0,10).OrderBy(i => random.NextDouble()).Take(3).ToList();

这是一个非常漂亮的解决方案。我不知道它会提供不同的数字。 - Moriya

3

!placeHolder.Contains(randomNo) 是你在这里遇到的问题,因为如果列表包含随机数,则while循环将结束。 请像这样在内部if中检查!placeHolder.Contains(randomNo)

while (placeHolder.Count != 3)
{
    if( !placeHolder.Contains(randomNo) )
      placeHolder.Add(randomNo);
    randomNo = random.Next(0, 10);
}

0

有时它会失败,因为在Rand.Next返回与列表中已有的数字相同的情况下(极少见),!placeHolder.Contains(randomNo)将返回false; false && anything = 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的解决方案比我的好:(


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();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接