【问题标题】:Random number issue with Next method (.NET Framework)Next 方法的随机数问题(.NET Framework)
【发布时间】:2014-09-25 19:55:09
【问题描述】:

我需要生成大量随机数,这些随机数必须介于 1 和 int.MaxValue 之间。传递给 Random 类的 Next 方法的参数并不总是相同的。在一种情况下,参数可能如下:

Next(1, int.MaxValue);

在另一种情况下,它们也可能是:

Next(1, 2);

这里的问题是,每当您传递 1 和 2 或 99 和 100 之类的值时,较小的数字始终是该方法返回的“随机”数字。这样做的原因是因为该方法从最大值中减去 1(除非最小值和最大值相同),然后给您随机数。如上所述,如果没有得到这个可预测的结果,我将如何在一个数字范围内生成一系列随机数?

【问题讨论】:

    标签: c# .net random


    【解决方案1】:

    您需要通过包含上限 + 1,即:

    var result = rand.Next(1, 2+1); // Returns 1 or 2
    var result2 = rand.Next(99, 101); // Returns 99 or 100
    

    请注意,这当然不适用于int.MaxValue。没有办法让Random 直接返回int.MaxValue。要获得 [0,int.MaxValue] 结果,您需要执行以下操作:

    var result = rand.Next(-1, int.MaxValue) + 1;
    

    【讨论】:

    • 我不认为 .NET 想要 int.MaxValue + 1。
    【解决方案2】:

    上限是独占的,不包括在内。鉴于此,范围 [1,2) 只包含一个数字,1,而不是两个。

    【讨论】:

      【解决方案3】:

      the documentationNext(int, int) 的第一个参数是“包含下界”,第二个参数是“独占上限”。 p>

      如果您想生成可能是12 的随机数,您应该使用以下调用:

      rand.Next(1, 3)
      

      【讨论】:

        【解决方案4】:

        试试这个

        using System;
        
        namespace ConsoleApplication3
        {
          class Program
          {
            static readonly Random r = new Random();
            static void Main(string[] args)
            {
                for (int i = 2; i <= 100; i++)
                {
                    Console.WriteLine(GetRandom(i));
                }
            }
        
            private static int GetRandom(int i)
            {
                return 1 + (r.Next(int.MaxValue)%i);
            }
          }
        }
        

        干杯。

        【讨论】:

          【解决方案5】:

          随机得到int后加上1就可以得到int.MaxValue

          var result = rand.Next(1, int.MaxValue) + 1;
          

          【讨论】:

          • 这样做,你永远不会得到下限。
          • 下限可以设置为比实际下限小1。
          • 你所做的只是从上加1到下减1......
          【解决方案6】:

          采用下限和上限并为您提供所需内容的方法怎么样?

          例子:

              public int GetRandom(int lower, int upper)
              {
                  return upper == int.MaxValue ? rand.Next(lower - 1, upper) + 1 : rand.Next(lower, upper + 1);
              }
          

          如果上限是 int.MaxValue,它将范围向下移动 1,然后在给出随机数后将其加回。否则,它会将上限加 1,然后给您随机数。

          然后当你使用它时,你会做这样的事情:

              var randomOne = GetRandom(1, 2);
              var randomTwo = GetRandom(99,int.MaxValue);
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-04-05
            • 2015-09-18
            • 2021-05-18
            • 1970-01-01
            相关资源
            最近更新 更多