gpt4 book ai didi

java - Random() 总是使用种子选择相同的数字

转载 作者:太空宇宙 更新时间:2023-11-04 13:30:22 26 4
gpt4 key购买 nike

我有一个非常奇怪的错误,我正在尝试修复。我会尽力解释它。

我有一个类,在该类中我有一个选择随机数的方法。每次运行应用程序时,随机数生成都必须生成完全相同的数字序列(不同的数字,但无论我何时运行应用程序,都以相同的顺序出现)。

因此我需要使用种子。

我的代码看起来像这样:

    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();
}
}
}

我有一个使用它的帮助器类,它看起来有点像这样:

   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);
}

在主方法的第一个循环中,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;
}

}

最佳答案

在循环中,我想您不想重置随机数生成器?

在示例中,您可以执行以下操作:

 Clas c1 = new Clas();
for(int i=0; i<100; i++)
{
Helper h = new Helper(c1);
System.out.println(h.getR());
}

在您的原始示例中,您似乎有多个 Tree 实例,因此您无法使用它。但是您可以将随机声明为静态,因此它在所有树之间共享:

static Random rand = new Random(1825897);

关于java - Random() 总是使用种子选择相同的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32259528/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com