Next方法(.NET Framework)的随机数问题

本文关键字:随机数 问题 Framework 方法 NET Next | 更新日期: 2023-09-27 18:24:38

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

Next(1, int.MaxValue);

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

Next(1, 2);

这里的问题是,每当您传递1和2或99和100这样的值时,较低的数字总是该方法返回的"随机"数字。原因是该方法从最大值中减去1(除非min和max相同),然后给出随机数。如上所述,如果没有得到这种可预测的结果,我该如何在一系列数字中生成一系列随机数字?

Next方法(.NET Framework)的随机数问题

您需要通过包含上界+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;

上界是互斥的,而不是包含的。考虑到这一点,范围[1,2)只包含一个数字,1,而不是两个。

在文档中,Next(int, int)的第一个参数是"包含下界",而第二个参数则是"不包含上界"。

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

rand.Next(1, 3)

试试这个

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

干杯。

您可以在获得随机int:后添加1来获得int.MaxValue

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

一个接受下限和上限并给出您想要的东西的方法怎么样?

示例:

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