为什么我的随机数生成器在C#中不是随机的?

ade*_*ena 19 c# random

我在Microsoft Visual C#2008 Express中工作.

我找到了这段代码:

    public static int RandomNumber(int min, int max)
    {
        Random random = new Random();

        return random.Next(min, max);
    }
Run Code Online (Sandbox Code Playgroud)

问题是我运行了100多次,当我的min = 0和max = 1时,它总是给我相同的答案.我每次都得到0.(我创建了一个测试函数来运行它 - 真的 - 我每次都得到0).我很难相信这是巧合...我还能做些什么来检查或测试这个?(我确实重新进行了测试,min = 0和max = 10,前50次,结果总是"5",第二次50次,结果总是"9".

?? 我需要一些更随意随意的东西......

-Adeena

Ann*_*ath 47

min = 0和max = 1的问题是min是包含的,max是独占的.因此,该组合的唯一可能值为0.


mat*_*sza 32

random = new Random();
Run Code Online (Sandbox Code Playgroud)

这将启动具有当前时间(以秒为单位)的随机数生成器.在系统时钟更改之前多次调用函数时,随机数生成器将以相同的值启动,因此它返回相同的值序列.

  • Random()构造函数的文档几乎逐字描述了这个问题:http://msdn.microsoft.com/en-us/library/h343ddh9.aspx (5认同)

Eri*_*ric 18

不要为Next创建包装器方法.它浪费了创建Random类的新实例的循环.只需使用同一个!

Random myRand = new Random();

for(int i = 0; i < 10; i++)
{
    Console.WriteLine(myRand.Next(0, 10).ToString());
}
Run Code Online (Sandbox Code Playgroud)

这应该给你十个随机值.

如前所述 - Random是伪随机的(如同所有实现一样),如果您使用相同的种子创建100个实例,您将获得100个相同结果的实例.确保你重复使用课程.

此外,正如人们所说,请注意MinValue是包容性的,MaxValue是独家的.根据你的需要,做myRand.Next(0,2).


Dav*_*man 7

Next()的重载返回:

大于或等于minValue且小于maxValue的32位有符号整数; 也就是说,返回值的范围包括minValue但不包括MaxValue.如果minValue等于maxValue,则返回minValue.

0是唯一可能返回的值.也许你想要random.NextDouble(),它将在0和1之间返回一个double.


Agi*_*Jon 6

最小值是包容性的,但最大值是独家的. 查看API


SLa*_*aks 6

你总是得到0因为Random.Next返回整数.你需要调用Random.NextDouble,它将返回0到1之间的数字.另外,你应该重用你的Random实例,如下所示:

[ThreadStatic]
static Random random;
public static Random Random { 
    get {
        if (random == null) random = new Random();
        return random;
    }
}
public static int RandomInteger(int min, int max)
{
    return Random.Next(min, max);
}
public static double RandomDouble() //Between 0 and 1
{ 
    return Random.NextDouble();
} 
Run Code Online (Sandbox Code Playgroud)

如果您想要加密安全的随机数,请使用RNGCryptoServiceProvider该类; 看到这篇文章

编辑:线程安全

  • -1因为这段代码是危险的错误.Random不是线程安全的,并且您在不提供任何锁定或每线程实例的情况下访问共享实例. (2认同)