我需要生成大量随机数,这些随机数必须介于1和int.MaxValue之间。传递给Random类的Next方法的参数并不总是相同的。在一个论坛中,论点可能如下:
Next(1, int.MaxValue);
在另一个他们可能也是:
Next(1, 2);
这里的问题是,无论何时传递1和2或99和100之类的值,较低的数字始终是" random"方法返回的数字。原因是因为该方法从最大值中减去1(除非min和max相同),然后给出随机数。如上所述,如何在一系列数字范围内生成一系列随机数,而不会获得可预测的结果?
答案 0 :(得分:6)
您需要传递包含上限+ 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 :(得分:4)
上限是独占的,不包括在内。鉴于此,范围[1,2]仅包含一个数字,而不是两个数字。
答案 2 :(得分:1)
从the documentation,Next(int, int)
的第一个参数是" 包含下限",而第二个参数是" 独家上限"。
如果您要生成可能是1
或2
的随机数,则应使用以下调用:
rand.Next(1, 3)
答案 3 :(得分:0)
采用下限和上限并为您提供所需内容的方法怎么样?
示例:
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);
答案 4 :(得分:0)
试试这个
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 :(得分:0)
您可以在获得int.MaxValue
之后添加1
来获取int
:
var result = rand.Next(1, int.MaxValue) + 1;