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

时间:2014-09-25 19:55:09

标签: c# .net random

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

Next(1, int.MaxValue);

在另一个他们可能也是:

Next(1, 2);

这里的问题是,无论何时传递1和2或99和100之类的值,较低的数字始终是" random"方法返回的数字。原因是因为该方法从最大值中减去1(除非min和max相同),然后给出随机数。如上所述,如何在一系列数字范围内生成一系列随机数,而不会获得可预测的结果?

6 个答案:

答案 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 documentationNext(int, int)的第一个参数是" 包含下限",而第二个参数是" 独家上限"。

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

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;