C# 如何生成9个唯一的随机数

C# 如何生成9个唯一的随机数,c#,random,C#,Random,我想生成9个随机数,但我不想生成同一个数两次。有没有一个简单的方法可以做到这一点 我想创建0到10之间的数字,得到数字1,2,3,4,5,6,7,8,9。我将把这些数字放在一个数组中,如果我两次得到相同的数字,代码将不起作用,而且每次启动程序时,它们都必须是随机的、不同的数字。只需不断生成新的数字,并将它们与以前生成的数字进行比较。使用 我发现这是一个比检查旧数字更干净的解决方案,理论上可能永远循环; using System; using System.Linq; namespace Tes

我想生成9个随机数,但我不想生成同一个数两次。有没有一个简单的方法可以做到这一点


我想创建0到10之间的数字,得到数字1,2,3,4,5,6,7,8,9。我将把这些数字放在一个数组中,如果我两次得到相同的数字,代码将不起作用,而且每次启动程序时,它们都必须是随机的、不同的数字。

只需不断生成新的数字,并将它们与以前生成的数字进行比较。

使用

我发现这是一个比检查旧数字更干净的解决方案,理论上可能永远循环;
using System;
using System.Linq;

namespace Test {
  class Program {
    static void Main(string[] args) {
      var random = new Random();
      int[] sequence = new int[9];
      do {
        for (var i = 0; i < sequence.Length; i++) {
          sequence[i] = random.Next();
        }
      } while (sequence.Distinct().Count() != sequence.Length);
    }
  }
}
使用System.Linq; 名称空间测试{ 班级计划{ 静态void Main(字符串[]参数){ var random=新的random(); int[]序列=新的int[9]; 做{ 对于(var i=0;i只要范围远大于所需的项目数,您就可以在丢弃重复项的同时继续生成项目,直到获得所需的项目数为止

伪代码:

  • 而我只有不到N个项目
    • 生成项目
    • 如果是重复的,就丢弃它
如果范围较小,并且您需要的项目数量占很大比例(例如,1-10个数字中有9个),则您可能更喜欢使用

伪代码:

  • 列举整个范围
  • 将枚举无序排列为随机顺序
  • 以前N项为例

Fisher-Yates Shuffle是另一个很好的解决方案:

Random _random = new Random();

public static void Shuffle<T>(T[] array)
{
    var random = _random;
    for (int i = array.Length; i > 1; i--)
    {
        // Pick random element to swap.
        int j = random.Next(i); // 0 <= j <= i-1
        // Swap.
        T tmp = array[j];
        array[j] = array[i - 1];
        array[i - 1] = tmp;
    }
 }
此方法将原始数组洗牌到位,但它可以轻松修改,以便返回不同的对象。不需要对“以前的值”进行比较。在您的例子中,它只需迭代8次。

Random r=new Random();
int[] numbers = (
    from number in Enumerable.Range(0, 10)
    orderby Guid.NewGuid()
    select number)
    .ToArray();
列表编号=新列表{1,2,3,4,5,6,7,8,9}; 列表结果=新列表(); while(numbers.Count()>0) { int pos=r.Next(0,numbers.Count()-1); 结果。添加(编号[pos]); 号码。删除(pos); }
对10个数字使用循环,并使用int r=arc4random()%数字;其中number是number生成、存储和使用这些编号的范围。我希望它能帮助您更好地了解您的需求。

这将生成6个介于0和10之间的随机整数(不包括):


你们有射程吗?最小接受值是多少?或者是最大的一个?我想利用时间戳来进行这类检查。检查之前生成的数字有什么困难,以至于您正在寻找一种“简单的方法”?重复的链接是一篇非常好的文章。我再怎么强调解决方案“不断生成并搜索碰撞”有多糟糕也不为过,这是一次采访“nohire”。为了解决这个问题,我自己提出了洗牌算法,后来才发现它已经发明出来,并命名为Fisher-Yates洗牌。
int[] numbers = (
    from number in Enumerable.Range(0, 10)
    orderby Guid.NewGuid()
    select number)
    .ToArray();
Random r = new Random();
List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
List<int> result = new List<int>();
while (numbers.Count() > 0)
{
    int pos = r.Next(0, numbers.Count() - 1);
    result.Add(numbers[pos]);
    numbers.RemoveAt(pos);
}
int[] numbers = Enumerable.Range(0, 10)
                .OrderBy(i => Guid.NewGuid())
                .Take(6)
                .ToArray();