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

本文关键字:数字 三个 唯一 列表 方法 最佳 之间 生成 | 更新日期: 2023-09-27 17:54:23

基本上都在标题中。这很简单,但我不知道为什么我的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之间,并且是唯一的

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

您可以使用

创建一个简洁的LINQ双行代码
var random = new Random();
return Enumerable.Range(0,10).OrderBy(i => random.NextDouble()).Take(3).ToList();

!placeHolder.Contains(randomNo)是您的问题,因为如果列表包含randomNo, while结束。检查内部if中的!placeHolder.Contains(randomNo),如下所示:

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

来得有点晚,但集合算法看起来相当优雅,所以我忍不住:

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

有时会失败,因为在极少数情况下,Rand。下一步确实返回一个相同的数字,这些已经在列表中,!placeHolder.Contains(randomNo)将返回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;

[edit]:这个线程移动得很快…和动物的解决方案比我的好得多:(