【问题标题】:Random() constructor parameterRandom() 构造函数参数
【发布时间】:2015-03-24 01:50:42
【问题描述】:

我试图理解 Random() 构造函数。我明白,如果我有这样的代码:

Random rand = new Random(47);
System.out.println(rand.nextInt(10));

那么 rand.nextInt(10) 会生成一个 0 到 9 之间的随机数,但是传递给 Random() 构造函数的 47 是做什么用的呢?我找到了一些关于 Random 作为类的 wiki,但没有任何内容说明构造函数如何为我工作。非常感谢。

【问题讨论】:

  • 这是给定的随机函数seed,如docs中所述。

标签: java random constructor random-seed


【解决方案1】:

Random 构造函数参数是内部伪随机数生成器的种子或起点。如果您使用相同的种子构造两个Random 对象,它们将生成相同的伪随机数序列。

要解决这个问题,请构造您的 Random 对象,并传递 new Date().getTime() 作为参数。这将确保您每次获得不同的序列(当代码执行间隔超过 1 毫秒时)。

【讨论】:

  • 我相信默认构造函数无论如何都会使用该逻辑。
  • 应该可以——我没看过源代码。
【解决方案2】:

尝试一遍又一遍地运行您的程序。每次都会得到相同的输出,直到将 47 更改为其他值,然后每次运行都会得到不同的结果。

为什么需要随机种子?计算机通过复杂的数学运算生成随机数,使结果看起来是随机的。

以下是 Random 的大致工作原理:

class Random {
    int seed;

    // initial condition of the random number generator
    public Random(int seed) { this.seed = seed; }

    public int nextInt(int range) {
        // some complicated formula to find out the next number
        int nextNumber = ... seed ... ;
        // update state of random number generator
        seed = nextNumber;


        return nextNumber % range;
    }
}

另见:

【讨论】:

  • 这给人一种对Random使用的随机策略的误导印象。
  • 我在隐藏公式。
  • 好的。这似乎更好:-) (+1)
  • 值得注意的是,常数种子对于测试很有用,因此您可以知道您将获得的“随机”数字。
【解决方案3】:

使用种子是为了对随机数序列有更多的控制。具有相同种子的不同随机实例将产生相同的随机序列。 种子每次可以不同,产生不同的序列

【讨论】:

    猜你喜欢
    • 2017-01-18
    • 1970-01-01
    • 2015-09-28
    • 1970-01-01
    • 1970-01-01
    • 2022-09-23
    • 2013-09-08
    • 2011-03-15
    • 1970-01-01
    相关资源
    最近更新 更多