【问题标题】:How to generate 9 unique random numers [closed]如何生成 9 个唯一的随机数 [关闭]
【发布时间】:2013-11-29 09:04:44
【问题描述】:

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

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

【问题讨论】:

标签: c# random


【解决方案1】:

继续生成新的数字并将它们与之前生成的数字进行比较

【讨论】:

    【解决方案2】:

    使用shuffle bag

    我发现它比检查旧号码更清洁,理论上可能会永远循环。

    【讨论】:

    • 链接是相当不错的文章。我无法强调解决方案“不断生成并搜索碰撞”有多糟糕,这就是“nohire”的采访。
    • 为了解决这个问题,我自己提出了shuffle算法,后来发现它已经被发明并命名为Fisher-Yates shuffle。
    【解决方案3】:

    只要范围远大于您需要的项目数,您应该可以轻松地继续生成项目,同时丢弃重复项,直到获得所需的项目数。

    伪代码:

    • 虽然我的物品少于 N
      • 生成项目
      • 如果是重复的,丢弃它

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

    伪代码:

    • 枚举整个范围
    • 将枚举随机排列
    • 取前 N 项

    【讨论】:

      【解决方案4】:

      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 次。

      【讨论】:

        【解决方案5】:
        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);
            }
          }
        }
        

        【讨论】:

          【解决方案6】:
          int[] numbers = (
              from number in Enumerable.Range(0, 10)
              orderby Guid.NewGuid()
              select number)
              .ToArray();
          

          【讨论】:

            【解决方案7】:

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

            【讨论】:

              【解决方案8】:

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

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

              【讨论】:

                【解决方案9】:
                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);
                }
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2017-09-24
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2023-03-16
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多