Random() 总是使用种子选择相同的数字
Random() always picks the same number using a seed
我正在尝试修复一个非常奇怪的错误。我会尽力解释的。
我有一个 class,在那个 class 我有一个选择随机数的方法。
每次我 运行 应用程序时,随机数生成必须生成完全相同的数字序列(不同的数字,但无论我何时 运行 应用程序都以相同的顺序出现)。
因此我需要使用种子。
我的代码看起来像这样:
public class Tree{
Random rand = new Random(12345);
///...code...///
public Tree randomNode() {
//HERE IS THE ERROR
int r = rand.nextInt(this.size);
if (r == 0) {
return this;
}
else if (left != null && 1 <= r && r <= left.size) {
return left.randomNode();
}
else {
return right.randomNode();
}
}
}
我有一个助手class使用这个,它看起来有点像这样:
public Crossover(Tree p1, Tree p2)
{
Tree subtreeP1 = p1.randomNode();
Tree subtreeP2 = p2.randomNode();
}
我的主要方法看起来有点像这样:
for(i=0;i<cross;i++)
{
Crossover c = new Crossover(p1,p2);
}
在 main 方法的第一个循环中,r
的数字随机生成并且没有问题。但是,在第二个循环(以及随后的所有循环)中,我遇到了问题。
问题出在 int r = rand.nextInt(this.size);
线上——在第二个循环之后,无论如何我总是得到 0。
如果我删除种子,一切正常。如果我包括种子,我在第一个循环后开始总是得到 0。
我怎样才能继续使用种子,但得到随机数?我做错了什么?
**编辑:**
this.size
指的是我树的大小。当我 r
为 0 时,我已确保它不为零。
另外我想指出的是,当我简单地删除数字种子时,它工作正常,随机数生成工作正常。当我添加种子时,我遇到了问题。
编辑 #2
好的,按照要求,我整理了一个小程序来说明我的问题。只是 运行 原样。一次有种子,一次没有。
import java.util.*;
public class Problem{
public static void main(String args[])
{
for(int i=0; i<100; i++)
{
Clas c1 = new Clas();
Helper h = new Helper(c1);
System.out.println(h.getR());
}
}
}
class Helper
{
int r;
Helper(Clas c)
{
r = c.method();
}
public int getR()
{
return r;
}
}
class Clas
{
Random rand = new Random(1825897);
Clas()
{
}
public int method()
{
int r = rand.nextInt(10);
return r;
}
}
尝试使用函数 Math.random()
生成您的随机数。 Math.random()
生成一个介于 0 和 1 之间的随机数。
在循环中,我想您不想重置随机数生成器吧?
在示例中,您可以这样做:
Clas c1 = new Clas();
for(int i=0; i<100; i++)
{
Helper h = new Helper(c1);
System.out.println(h.getR());
}
在你原来的例子中,你似乎有多个 Tree 实例,所以你不能使用它。但是你可以声明你的 Random static,所以它在所有 Trees 之间共享:
static Random rand = new Random(1825897);
我正在尝试修复一个非常奇怪的错误。我会尽力解释的。
我有一个 class,在那个 class 我有一个选择随机数的方法。 每次我 运行 应用程序时,随机数生成必须生成完全相同的数字序列(不同的数字,但无论我何时 运行 应用程序都以相同的顺序出现)。
因此我需要使用种子。
我的代码看起来像这样:
public class Tree{
Random rand = new Random(12345);
///...code...///
public Tree randomNode() {
//HERE IS THE ERROR
int r = rand.nextInt(this.size);
if (r == 0) {
return this;
}
else if (left != null && 1 <= r && r <= left.size) {
return left.randomNode();
}
else {
return right.randomNode();
}
}
}
我有一个助手class使用这个,它看起来有点像这样:
public Crossover(Tree p1, Tree p2)
{
Tree subtreeP1 = p1.randomNode();
Tree subtreeP2 = p2.randomNode();
}
我的主要方法看起来有点像这样:
for(i=0;i<cross;i++)
{
Crossover c = new Crossover(p1,p2);
}
在 main 方法的第一个循环中,r
的数字随机生成并且没有问题。但是,在第二个循环(以及随后的所有循环)中,我遇到了问题。
问题出在 int r = rand.nextInt(this.size);
线上——在第二个循环之后,无论如何我总是得到 0。
如果我删除种子,一切正常。如果我包括种子,我在第一个循环后开始总是得到 0。
我怎样才能继续使用种子,但得到随机数?我做错了什么?
**编辑:**
this.size
指的是我树的大小。当我 r
为 0 时,我已确保它不为零。
另外我想指出的是,当我简单地删除数字种子时,它工作正常,随机数生成工作正常。当我添加种子时,我遇到了问题。
编辑 #2 好的,按照要求,我整理了一个小程序来说明我的问题。只是 运行 原样。一次有种子,一次没有。
import java.util.*;
public class Problem{
public static void main(String args[])
{
for(int i=0; i<100; i++)
{
Clas c1 = new Clas();
Helper h = new Helper(c1);
System.out.println(h.getR());
}
}
}
class Helper
{
int r;
Helper(Clas c)
{
r = c.method();
}
public int getR()
{
return r;
}
}
class Clas
{
Random rand = new Random(1825897);
Clas()
{
}
public int method()
{
int r = rand.nextInt(10);
return r;
}
}
尝试使用函数 Math.random()
生成您的随机数。 Math.random()
生成一个介于 0 和 1 之间的随机数。
在循环中,我想您不想重置随机数生成器吧?
在示例中,您可以这样做:
Clas c1 = new Clas();
for(int i=0; i<100; i++)
{
Helper h = new Helper(c1);
System.out.println(h.getR());
}
在你原来的例子中,你似乎有多个 Tree 实例,所以你不能使用它。但是你可以声明你的 Random static,所以它在所有 Trees 之间共享:
static Random rand = new Random(1825897);