【问题标题】:Why do I keep getting two of same random values in this code? [duplicate]为什么我在这段代码中不断得到两个相同的随机值? [复制]
【发布时间】:2011-11-29 05:09:10
【问题描述】:

可能重复:
Why does it appear that my random number generator isn't random in C#?

我有以下代码:

        int a;
        int aa;

        Random aRand = new Random();
        Random aaRand = new Random();

        a = aRand.Next(20);
        aa = aaRand.Next(20);

        //if (a == aa)
        {
            Console.WriteLine(a + " " + aa);
            Console.ReadLine();
        }

我假设 aRand 和 aaRand 是两个不同的值,但事实并非如此。我究竟做错了什么?我假设 aRand 和 aaRand 并不总是相同,但它们始终保持相同。

谢谢

【问题讨论】:

  • c# 是正确的语言,sry。

标签: c# random


【解决方案1】:

Random() 的文档中明确介绍了这一点:

默认种子值来自系统时钟,具有有限的 解决。结果,创建的不同 Random 对象 通过调用默认构造函数的紧密继承将具有 相同的默认种子值,因此,将产生相同的 随机数集。

【讨论】:

    【解决方案2】:

    为什么要创建两个不同的随机变量?你可以只用一个:

    int a;
    int aa;
    
    Random aRand = new Random();
    
    a = aRand.Next(20);
    aa = aRand.Next(20);
    
    //if (a == aa)
    {
        Console.WriteLine(a + " " + aa);
        Console.ReadLine();
    }
    

    编辑: “随机数的生成是从一个种子值开始的。如果重复使用同一个种子,就会生成同一系列的数字。产生不同序列的一种方法是使种子值与时间相关,从而每次产生不同的序列Random 的新实例。默认情况下,Random 类的无参构造函数使用系统时钟生成其种子值,而其有参构造函数可以根据当前时间的刻度数取一个 Int32 值。" 来自http://msdn.microsoft.com/en-us/library/system.random.aspx

    【讨论】:

    • 是的,我只做了一个,它成功了。谢谢
    【解决方案3】:

    您只需要 Random() 的一个实例 - 只需调用 .Next() 两次。

    int a;
    int aa;
    
    Random aRand = new Random();
    
    a = aRand.Next(20);
    aa = aRand.Next(20);
    

    【讨论】:

      【解决方案4】:

      整个应用程序中的随机变量不应超过一个。摆脱第二个

      Random aaRand = new Random();
      

      【讨论】:

        【解决方案5】:

        看起来这两个实例使用的是同一个种子。

        种子决定了将要生成的所有值以及生成的顺序。如果您使用相同的种子创建 200 个 Random 实例,它们都会为您提供相同的输出。

        在您的应用启动时创建一个实例并重复使用它。

        【讨论】:

          猜你喜欢
          • 2012-04-25
          • 2016-11-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多