【发布时间】:2017-01-15 18:51:04
【问题描述】:
我的问题是关于 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 个随机数。我知道这有点奇怪,但在我的实际项目中每次都需要一个新的随机数生成器。我收到的种子是连续的。对于任何种子,生成的第一个随机双精度数都非常接近,这是因为用作初始化的线性同余公式吗?
生成的第二个 double 实际上看起来确实是随机的,这样假设是否安全?是否可以先生成一个未使用的随机数,然后根据创建它的实际原因开始使用它?
提前谢谢你
编辑:
让我澄清一下:
int possibleRoutes = 7;
void handlePacket(Packet p) {
int chosenRoute = p.hash % possibleRoutes;
// ...Other code...
}
对比
int possibleRoutes = 7;
void handlePacket(Packet p) {
Random r = new Random(p.hash);
int chosenRoute = r.nextInt() % possibleRoutes;
// ...Other code...
}
}
对比
int possibleRoutes = 7;
void handlePacket(Packet p) {
Random r = new Random(p.hash);
r.nextInt();
int chosenRoute = r.nextInt() % possibleRoutes;
// ...Other code...
}
保证每个数据包必须采用相同的路由。目前,数据包哈希本质上是顺序的。有太多可能的哈希值无法保持任何类型的状态来加快速度。
【问题讨论】:
-
我不明白这种用法。 PRNG 有一个状态。只需创建一个(外部;如果需要,根据时间)并在循环内采样。第二次调用将基于与第一次不同的状态。无需重新播种。 (在几乎所有用例中,在循环中重新播种都是不好的做法)。扔掉RNG-numbers也只是在一些非常复杂的环境下才会做的,不是这里要追求的方法。
-
为了安全起见:告诉我们,为什么在每个循环中都需要一个新的 PRNG 对象(如果这是你想要的),或者每次调用程序时只需要新的数字。跨度>
-
为什么您认为每次迭代都需要一个新的随机数生成器?像这样的陈述往往反映了对 PRNG 的深刻误解。
-
我在原题中添加了真实案例的伪代码
-
感谢讨论,不胜感激