【问题标题】:Class Random only Generates 0类 Random 只生成 0
【发布时间】:2014-06-02 07:06:05
【问题描述】:

好的

我有一个问题,我想生成 0 到 1 之间的 64 个数字(即 0 或 1)

我目前拥有的功能是:

public static int randNr(int max) {
Random r = new Random();
int o = r.nextInt(max);
return o;
}

但它总是返回 0。 有什么办法让它也产生一个 1 ?

编辑:

该函数与我调用它时位于不同的 java 文件中!

【问题讨论】:

  • max 的值是多少?你得到的随机数达到“最大”
  • 您是否注意到最大值是独有的?要生成 0 或 1,需要传递 2。
  • @user2864740:你说得对,我对 .NET 感到困惑,因为它会生成相同的值(在 Java 中不会)。

标签: java class random


【解决方案1】:

两个问题:

1) nextInt(max); 生成一个从 0 到但不包括 max 的数字。我的猜测是您将 1 作为max 传递。通过 2,一切都会好起来的。

2) 每次创建一个新的生成器对象都会破坏生成器的统计属性。您应该创建一个 Random 实例并 (i) 传递给函数或 (ii) 将该实例存储为成员变量。

【讨论】:

    【解决方案2】:

    这个功能很好用。您可能使用 错误的参数 调用它。应该是:

    randNr(2)
    

    为什么?因为它使用了Random#nextInt(max)方法,它会返回一个[0, max-1]范围内的随机整数(包括0max-1)。

    注意:不建议每次调用函数时都创建一个新的Random 对象。一种解决方案是将Random 对象声明为类的static 成员:

    public class Test
    {
        private static Random r = new Random();
        // ...
    }
    

    另一种解决方案是使用static 方法Math.random()1

    int o = (int) Math.round(Math.random());
    

    1:有人可以确认这种方法是否比 OP 的方法快吗?

    【讨论】:

    • 很好的答案,因为你解决了要点,但是Random 对象的滥用不仅仅是效率问题,更重要的是,随机数的分布不会有正确的统计属性。
    • @Bathsheba 你能解释清楚一点吗?我对其进行了测试,它似乎给出了正确的结果。
    • 不,您的解决方案是正确的。我只是不喜欢强调效率。由于随机数滥用,有许多科学论文是假的。绘制 0 和 1 的随机数序列应具有 1/2 的平均值和 1/4 的方差。我怀疑连续将随机生成器种子设置为系统时钟时产生的序列是否具有这些属性。
    • 可能是对的。但我仍然认为在每次迭代中创建一个 1-use-object 效率低下且不切实际。
    • @Bathsheba 你们都是对的。现代 CPU 是如此之快,以至于可以用相同的种子实例化许多 PRNG 实例,这破坏了实例之间的相关性和分布行为。从效率的角度来看,这就像每次你想要一杯水时就挖一口新井,而不是挖一口井然后再回去喝多少杯水。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-22
    • 2011-03-11
    相关资源
    最近更新 更多