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

时间:2013-11-29 09:04:45

标签: c# random

我想生成9个随机数,但我不想两次生成相同的数字。有一个简单的方法吗?

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

9 个答案:

答案 0 :(得分:1)

只需继续生成新数字并将其与之前生成的数字进行比较

答案 1 :(得分:1)

使用shuffle bag

我发现它比检查旧数字更清晰,理论上可能永远循环。

答案 2 :(得分:1)

只要范围远远大于您需要的项目数量,您就可以毫不费力地在丢弃重复项目时继续生成项目,直到您拥有所需数量的项目为止。

伪代码:

  • 虽然我的项目少于N个
    • 生成项目
    • 如果是重复,请将其丢弃

如果范围很小,并且您需要的项目数量占很大比例(例如1-10中的9个数字),您可能更愿意使用shuffle bag

伪代码:

  • 枚举整个范围
  • 将枚举随机顺序洗牌
  • 取前N项

答案 3 :(得分:1)

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

并称之为:

int[] array = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
Shuffle(array);

此方法将原始数组混合到位,但可以轻松修改它以便返回不同的对象。没有比较所需的“以前的价值”。在你的情况下,它只迭代8次。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

int[] numbers = (
    from number in Enumerable.Range(0, 10)
    orderby Guid.NewGuid()
    select number)
    .ToArray();

答案 6 :(得分:0)

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

答案 7 :(得分:0)

对10个数字使用循环并使用,int r = arc4random()%numbers;其中number是生成,存储和使用这些数字的范围。我希望它可以帮助您更好地了解您的需求。

答案 8 :(得分:0)

这会在0到10之间生成6个随机整数(不包括):

int[] numbers = Enumerable.Range(0, 10)
                .OrderBy(i => Guid.NewGuid())
                .Take(6)
                .ToArray();