Java RNG播种

时间:2017-01-15 18:51:05

标签: java random numbers seed

我的问题涉及Java RNG;使用以下代码:

for (int s = 0; s < 600; s++) {
   Random r = new Random(s);
   System.out.println(r.nextDouble());
   System.out.println(r.nextDouble() + "\n-----");
}

这将导致生成600个随机数。我知道这有点奇怪,但我每次在实际项目中都需要一个新的随机数生成器。我收到的种子是连续的。对于任何种子,生成的第一个随机双精度非常接近,这是因为用作初始化的线性同余公式?

生成的第二个双重实际上看起来实际上是随机的,这样安全吗?是否可以首先生成一个未使用的随机数,然后开始使用它,因为它的创建原因是什么?

提前谢谢

编辑:

让我澄清一下:

int possibleRoutes = 7;
void handlePacket(Packet p) {

    int chosenRoute = p.hash % possibleRoutes;
    // ...Other code...

}

VS

int possibleRoutes = 7;
void handlePacket(Packet p) {

    Random r = new Random(p.hash);
    int chosenRoute = r.nextInt() % possibleRoutes;
    // ...Other code...
}

}

VS

int possibleRoutes = 7;
void handlePacket(Packet p) {

    Random r = new Random(p.hash);
    r.nextInt();
    int chosenRoute = r.nextInt() % possibleRoutes;
    // ...Other code...

}

保证每个数据包必须采用相同的路由。数据包哈希目前本质上是顺序的。有太多可能的哈希来保持任何类型的状态来加速这一点。

3 个答案:

答案 0 :(得分:0)

为什么你会给一个特殊号码作为种子?只需将其留空,因此Random构造函数将为您选择种子。

for (int s = 0; s < 600; s++) {
     Random r = new Random();
     System.out.println(r.nextDouble());
     System.out.println(r.nextDouble() + "\n-----");
   }

请参阅Role of seed in random number generation

答案 1 :(得分:0)

调用使用nanoTime作为种子的默认构造函数。这样您就不需要生成新的种子来每次迭代创建对象。

//loop through number of numbers needed
for(int i = 0; i < 100; i +)
    //Calls default constructor
    Random r = new Random();
    System.out.println(r.nextDouble()*.5);

答案 2 :(得分:0)

另一种方法是使用主随机种子循环中的所有补贴randoms:

  // VBox
VBox vb = new VBox();
vb.setPadding(new Insets(10, 50, 50, 50));
vb.setSpacing(10);