C# 下一个方法(.NET Framework)的随机数问题
我需要生成很多随机数,这些随机数必须介于1和int.MaxValue之间。传递给Random类的下一个方法的参数并不总是相同的。在一个senario中,论点可能如下: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(除非最小值和最大值相同),然后给出随机数。如前所述,我如何在一个数字范围内生成一个随机数范围,而不获得这
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。。。。。。