Random.Next始终返回相同的值

时间:2011-05-16 08:36:13

标签: c# math random

我使用该方法生成唯一编号,但我总是得到相同的编号-2147483648。即使我停止程序,重新编译它并再次运行我仍然看到相同的数字。

  public static int GetRandomInt(int length)
    {           
        var min = Math.Pow(10, length - 1);
        var max = Math.Pow(10, length) - 1;
        var random = new Random();
        return random.Next((int)min, (int)max);
    }

9 个答案:

答案 0 :(得分:7)

尝试外化随机实例:

private readonly Random _random = new Random();

public static int GetRandomInt(int length)
{           
    var min = Math.Pow(10, length - 1);
    var max = Math.Pow(10, length) - 1;
    return _random.Next((int)min, (int)max);
}

答案 1 :(得分:3)

这不是不重复使用Random实例的问题,他得到的结果应该是多次启动的随机,而不是总是 - (2 ^ 32)

这是长度过大的问题,并且将长度的强制转换为int。如果您将代码分成以下几行:

        var min = Math.Pow(10, length - 1);
        var max = Math.Pow(10, length) - 1;
        var random = new Random();
        var a = (int)min;
        var b = (int)max;
        return random.Next(a, b);

你会看到a和b是-2147483648,这是Next(min, max)唯一可能的结果(doc指定min == max,return min)。

使用此方法可以安全使用的最大长度为9.对于长度为10,您将获得System.ArgumentOutOfRangeException,长度为> 10你将得到-2147483648的结果。

答案 2 :(得分:2)

你应该保留一个Random实例而不是new()它的实例,这样可以给你更好的结果。

同时检查实际长度。它可能会给你带来有趣的结果。

答案 3 :(得分:2)

您的代码有三个问题。

  1. 您应该将随机变量外部化。
  2. 您遇到截断错误问题。
  3. min和max之间的范围很大。
  4. 第一个问题是因为在重新初始化随机变量时,您可能没有足够的时间推进种子。第二个错误来自将你的(非常大的)数字截断为整数。最后,你最大的问题是你的最小和最大之间的范围。考虑使用输入1-> 20:

    查找最小值和最大值之间的范围(在代码中定义)
    length  max-min        
    1       8
    2       89
    3       899
    4       8999
    5       89999
    6       899999
    7       8999999
    8       89999999
    9       899999999
    10      8,999,999,999
    11      89999999999
    12      899999999999
    13      8999999999999
    14      89999999999999
    15      899999999999999
    16      9E+15
    17      9E+16
    18      9E+17
    19      9E+18
    

    请记住,最大整数是2,147,483,647,它会在任何大于9的数字上传递。

答案 4 :(得分:1)

这篇文章已被讨论了数百次。 FAQ from stackoverflow on this

答案 5 :(得分:1)

我认为问题在于minmax的计算。它们会比Int32.MaxValue快得多......

答案 6 :(得分:0)

在你的班级中,有一个Random实例,例如:

public class MyClass
{
private readonly Random random = new Random();

public static int GetRandomInt(int length)
{
  var min = Math.Pow(10, length - 1);
  var max = Math.Pow(10, length) - 1;
  return random.Next((int)min, (int)max);
}

}

随机始终返回相同值的事实仅用于测试目的。

答案 7 :(得分:0)

随机类通常使用种子来初始化自己,并且通常会返回相同的序列,前提是种子是相同的:

  • 始终重复使用相同的Random()实例,而不是一遍又一遍地重新创建
  • 如果您想要不可预测的结果,请使用时间相关的种子而不是硬编码的种子

编写真正的随机数生成器非常困难。大多数方法使用外部熵发生器(例如鼠标移动,cpu温度,甚至复杂的物理机制,如氦气球相互碰撞......)。

答案 8 :(得分:0)

Random实例只应创建一次,然后重复使用。这样做的原因是RNG默认为当前系统时间播种。如果您快速创建新的Random实例(并从中拉出一个值),那么其中许多将以相同的时间戳播种,因为循环可能比系统时钟前进的速度更快。

请记住,由种子A初始化的RNG将始终返回序列B.因此,如果您创建了三个Random个实例,所有实例都以123为种子,则这三个实例将始终返回相同的数字。同样的迭代。