我的问题涉及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...
}
保证每个数据包必须采用相同的路由。数据包哈希目前本质上是顺序的。有太多可能的哈希来保持任何类型的状态来加速这一点。
答案 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-----");
}
答案 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);