【问题标题】:Generated random numbers are always equal [duplicate]生成的随机数总是相等的[重复]
【发布时间】:2012-05-22 19:16:48
【问题描述】:

我有一堂课:

public class MyClass
{
    public int MyMethod()
    {
        Random rand = new Random();

        return rand.Next() % 10 + 1;
    }
}

还有 2 个对象:

MyClass obj1 = new MyClass();
MyClass obj2 = new MyClass();

问题是obj1.MyMethod() == obj2.MyMethod() 总是这样。为什么会这样?避免它的最佳方法是什么?

【问题讨论】:

    标签: c# random


    【解决方案1】:

    静态创建随机对象

    public class MyClass
    {
       public static Random rand = new Random();
    
       public int MyMethod()
       {
           return rand.Next() % 10 + 1;
       }
    }
    

    System.DatTime.Now.Ticks 上的随机作品。

    如果我们这样做

    Random rand = new Random();
    

    在内部发生

    Random rand = new Random(System.DateTime.Now.Ticks);
    

    想一想,系统中唯一不变的就是系统时间。

    当使用 Random 类时,创建它的对象一次,然后在任何你想要的地方使用它的方法Next()。当在循环中创建随机对象时,您会在循环中发现这种情况。

    在您的代码中,它们是一个接一个地创建的,它们是由相同的 Ticks 种子值创建的。

    创建你的随机对象静态然后它们将不一样。

    【讨论】:

    • 感谢您的清晰解释。只要系统允许,我就会接受。
    • 请参阅this answer,了解为什么您的静态实现可能不安全。您需要锁定对 rand.Next 的访问权限,以防止 Random 实例可能的内部损坏
    • @SamHolder:Marc Gravell 的答案?
    • @NikhilAgrawal 是的,Marc Gravell 的回答。
    【解决方案2】:

    您每次都在创建一个新的Random。当您创建 Random 的新实例而不明确指定种子值时,它使用 System.DatTime.Now.Ticks 作为种子。由于调用速度很快,它们发生在相同的“滴答”处,因此使用相同的种子值。由于所有 Random 实例为相同的种子值生成完全相同的“随机”数序列,因此两个实例都会生成相同的“随机”值。

    这个问题之前在网站上已经讨论过很多次了,你应该搜索其中一个答案。

    但基本上你需要创建一次Random 对象并重复使用它。这可以静态完成,或者至少作为类变量。

    您应该阅读this question 及其答案以找到更好的方法。

    【讨论】:

    • 他的意思是这个 Random rnd = new Random((int)DateTime.Now.Ticks);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-14
    • 2019-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-22
    • 1970-01-01
    相关资源
    最近更新 更多