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相同),然后给出随机数。如上所述,如果没有得到这种可预测的结果,我该如何在一系列数字中生成一系列随机数字?
您需要通过包含上界+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)
的第一个参数是"包含的下界",而第二个参数则是"不包含的上界"。
如果你想生成一个可能是1
或2
的随机数,你应该使用以下调用:
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);