这是一个摇滚,纸张,剪刀游戏。我的问题是,如果我移动武器 private Random r = new Random(weapon.length);它会给我一个错误。如果我在方法中移动了weapon.length,它将成功运行。有什么不同?
public class Game {
private String[] weapons = {"rock", "paper", "scissor"};
private Random r = new Random(weapons.length);
public void thePick() {
System.out.println(weapons[r.nextInt()]);
}
}
VS
public class Game {
private String[] weapons = {"rock", "paper", "scissor"};
private Random r = new Random();
public void thePick() {
System.out.println(weapons[r.nextInt(weapons.length)]);
}
}
答案 0 :(得分:8)
r.nextInt()
都会给你任意随机整数。当您致电private Random r = new
Random(weapons.length);
时,实际上您正在为RNG播种3,而不是将上限设为3。
它可以给你42,200,000,000,-10等等。数组在位置42没有元素,你会得到一个错误,因为3的种子将总是产生一个随机值范围。如果它没有播种(即Random r=new Random()
),那么获得有效值的可能性很小,但这个机会非常小。
对于第二个,你是picking a random int with a bound,即从0到数组的长度(不包括上限)。
所以对你来说:
{"rock", "paper", "scissor"};
rock是元素0,paper是元素1,剪刀是元素2. random.nextInt(weapons.length)调用总是返回0到2的int(3,长度,不包括在内)。< / p>
答案 1 :(得分:3)
第一个每次都会抛出ArrayIndexOutOfBoundsException。实际上它总是抛出异常
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1155099828
at Game.thePick(Game.java:11)
感谢@hexafraction发现它。
第二种方法不会打印异常,而是选择随机选择。
答案 2 :(得分:0)
第二个传递的值为0 - 2
第一个随机传递整个int范围,所以它几乎会抛出一个ArrayOutOfBoundsException
但为什么你不尝试?
答案 3 :(得分:0)
您应该考虑阅读相应的Javadoc: 这是您第一次尝试时调用的构造函数:http://docs.oracle.com/javase/7/docs/api/java/util/Random.html#Random%28long%29 实际上,您提供的种子不会在指定范围内获得随机数。这意味着对.nextInt()的调用将在每次运行应用程序时返回相同的内容。
在您的第二次尝试中,您使用的是默认控制器(使用当前时间初始化为种子)并调用正确的方法:http://docs.oracle.com/javase/7/docs/api/java/util/Random.html#nextInt%28int%29
答案 4 :(得分:0)
Documentation是一件很棒的事情。明智地使用它。