C# 下一个方法(.NET Framework)的随机数问题

C# 下一个方法(.NET Framework)的随机数问题,c#,.net,random,C#,.net,Random,我需要生成很多随机数,这些随机数必须介于1和int.MaxValue之间。传递给Random类的下一个方法的参数并不总是相同的。在一个senario中,论点可能如下: Next(1, int.MaxValue); 另一方面,它们也可能是: Next(1, 2); 这里的问题是,每当您传递像1和2或99和100这样的值时,较低的数字总是该方法返回的“随机”数。这是因为该方法从最大值中减去1(除非最小值和最大值相同),然后给出随机数。如前所述,我如何在一个数字范围内生成一个随机数范围,而不获得这

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

Next(1, int.MaxValue);
另一方面,它们也可能是:

Next(1, 2);

这里的问题是,每当您传递像1和2或99和100这样的值时,较低的数字总是该方法返回的“随机”数。这是因为该方法从最大值中减去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;

上限是排他性的,不包括在内。鉴于此,范围[1,2]只包含一个数字,1,而不是两个。

从,到
下一个(int,int)
的第一个参数是“包含的下限”,而第二个参数是“排除的上限”

如果要生成可能是
1
2
的随机数,应使用以下调用:

rand.Next(1, 3)

有没有一种方法,可以取下限和上限,给出你想要的

例如:

    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);
试试这个

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);
    }
  }
}
使用系统;
命名空间控制台应用程序3
{
班级计划
{
静态只读随机r=新随机();
静态void Main(字符串[]参数)
{

对于(int i=2;i您可以通过在获取随机
int
后添加
1
来获取
int.MaxValue

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

我不认为.NET会喜欢int.MaxValue+1。这样做,你永远不会得到下限。下限可以设置为比实际下限小1。你所做的只是从上限加1变为下限减1。。。。。。