【问题标题】:Trouble with Random Numbers in C#C# 中的随机数问题
【发布时间】:2012-04-13 17:51:57
【问题描述】:

我确信这个问题被问了很多,但我在任何地方都找不到对我有帮助的答案。我正在尝试创建一个介于 0 和 1 之间的随机双精度数,但我不断收到错误。

map[x,y].setBit((int) Math.Round(((((double)Random.Next(100))/100) * 1.3), 2);

我得到的错误是“非静态、方法或属性“System.Random.Next(int)”需要对象引用

【问题讨论】:

    标签: c# random numbers


    【解决方案1】:

    错误消息准确地告诉您问题所在。 Random 是一个类。 Next 是一种非静态方法。您需要该类的实例或对象引用才能使用该方法。

    var random = new Random();
    // use random.Next(upperLimit);
    

    您应该注意,如果您在紧密循环中使用random,您可能希望在循环之外创建实例并重用它,或者在更高级别(例如类的成员字段)。类播种的方式,连续的实例将生成相同的“随机”值序列。 This is a common pit that people have fallen into.


    您还应该知道,根据您的使用情况,您将获得一个从 0 到 99 的整数、转换为 double 并除以 100...有一种更直接的方法。只需使用NextDouble(),它会给出大于或等于0 且小于1.0 的值。

    double d = random.NextDouble();
    

    【讨论】:

    • 谢谢!出于某种原因,当我用谷歌搜索那个错误时,我从来没有得到那个解决方案......我对这种语言有点陌生,你可能会说 ^.^
    • 您会很高兴地注意到,这个问题已经在google 上排在第四位。 ;)
    【解决方案2】:

    随机是一个类。 Random.Next() 是一个非静态方法。

    因此,您需要实例化Random 类的实例。 (注意:正如 Spender 指出的那样,不要将其设为本地循环......)

    Random rnd = new Random();
    
    map[x,y].setBit((int) Math.Round(((((double)rnd.Next(100))/100) * 1.3), 2); 
    

    【讨论】:

    • 看到这看起来像是在一个循环中完成的(甚至可能是嵌套循环),这两行看起来很危险地靠在一起。值得一提的是,rnd 很可能不是本地的。
    猜你喜欢
    • 2011-05-21
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-21
    • 2012-09-16
    • 2017-04-10
    • 1970-01-01
    相关资源
    最近更新 更多