【问题标题】:C# Random generationC# 随机生成
【发布时间】:2010-12-24 19:41:02
【问题描述】:

我刚刚在网上通过了这篇文章: C# CornerC# Corner 以及他的文章(一位拥有超过 13 年经验的软件开发人员)推荐使用 System.Random 如下:

private int RandomNumber(int min, int max)
{
    Random random = new Random();
    return random.Next(min, max); 
}

那不是每次都会给他相同的数字吗??

编辑:
所以我的问题将变成:Random 如何选择它的种子?一个常数或当前时间值?

谢谢

【问题讨论】:

标签: c# random


【解决方案1】:

您应该只初始化一次种子然后重复使用它:

private Random random = new Random();

private int RandomNumber(int min, int max)
{
    return random.Next(min, max); 
}

【讨论】:

    【解决方案2】:

    当方法在很短的时间间隔内经常被调用时,它会给出相同的结果。这是因为Randoms 种子是用当前时间值初始化的。 这也是为什么很多人有随机根本不是随机的那种问题的原因。

    顺便说一句,它不是 Math.Random 而是 System.Random


    编辑完成后,这里有一些关于如何初始化随机数的信息。信息来自上面的链接。

    随机数生成开始 从种子值。如果相同的种子是 反复使用,同一系列 生成数字。一种方法 产生不同的序列是使 种子值与时间相关,因此 制作不同的系列 随机的新实例。默认, 的无参数构造函数 随机类使用系统时钟 产生它的种子价值,而它的 参数化构造函数可以采用 基于 int32 值的个数 当前时间的刻度。然而, 因为时钟是有限的 分辨率,使用无参数 构造函数来创建不同的 Random 紧密连续的对象创建 产生的随机数生成器 相同的随机数序列。

    【讨论】:

      【解决方案3】:

      否,因为new Random() 将以当前时间作为种子初始化。也就是说,您应该仍然保留 random 的实例并重用它。

      【讨论】:

        【解决方案4】:

        也许吧。 Random 根据当前时间在没有明确种子的情况下创建。如果您拨打RandomNumber 的速度足够快,您偶尔会收到相同的号码。

        但是,您的直觉是正确的。每次需要新号码时都创建一个新的Random 对象是愚蠢的。您应该创建一个实例并使用它。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-03-18
          • 2015-07-19
          • 1970-01-01
          • 2021-05-13
          • 2011-01-24
          • 2011-02-27
          相关资源
          最近更新 更多