在尝试使用在创建时传递给对象的两个特定种子创建Coin对象类时,我注意到当将种子传递给int" seed"时,种子变量会生成不同的变量而不仅仅是将特定数字输入随机数发生器。这是来自Coin类的一些代码:
public int headCount;
public int tailCount;
public int seed;
public Coin( int n ){
seed = n;
headCount = 0;
tailCount = 0;
}
public Random flipGenerator = new Random(seed);
public String flip(){
String heads = "H";
String tails = "T";
boolean nextFlip = flipGenerator.nextBoolean();
if (nextFlip == true)
{
headCount++;
return heads;
}
if (nextFlip == false)
{
tailCount++;
return tails;
}
return null;
}
这里是创建和打印Coin对象的文件:
Coin coin1 = new Coin( 17 );
Coin coin2 = new Coin( 13 );
该文件中的代码使用17种子打印出随机翻转20次的结果,使用13种子打印10次,最后再次使用17种子打印35次。但是,使用
时输出不正确public Random flipGenerator = new Random(seed);
而不是
public Random flipGenerator = new Random(17);
或
public Random flipGenerator = new Random(13);
为什么会这样?
答案 0 :(得分:2)
在调用构造函数之前初始化实例字段。
就执行顺序而言,此代码:
public int headCount;
public int tailCount;
public int seed;
public Coin( int n ){
seed = n;
headCount = 0;
tailCount = 0;
}
public Random flipGenerator = new Random(seed);
在功能上等同于:
public int headCount;
public int tailCount;
public int seed;
public Random flipGenerator = new Random(seed);
public Coin( int n ){
seed = n;
headCount = 0;
tailCount = 0;
}
在Java中,任何未显式初始化的字段的值都为零/ null / false,因此总是执行flipGenerator = new Random(0)
。在构造函数中初始化seed
时,已经创建了Random对象。在构造函数之后声明实例字段的事实是无关紧要的,因为所有实例字段及其初始化表达式都是在调用构造函数之前执行的。
答案 1 :(得分:0)
每当初始化Coin
类时,它将使用0作为种子。无论你将flipGenerator
初始化放在构造函数下面,它仍然会在构造函数中被调用,因为它是一个实例变量。
Coin coin1 = new Coin( 17 );
Coin coin2 = new Coin( 13 );
此代码使用0,因为在传递种子时,flipGenerator已使用默认种子0进行初始化。
你需要这样做
public int headCount;
public int tailCount;
public int seed;
public Random flipGenerator;
public Coin( int n ){
seed = n;
headCount = 0;
tailCount = 0;
flipGenerator = new Random(seed);
}
...
}