这两种随机方法有什么区别?

时间:2013-10-08 16:51:26

标签: java random

这是一个摇滚,纸张,剪刀游戏。我的问题是,如果我移动武器 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)]);

 }
}

5 个答案:

答案 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是一件很棒的事情。明智地使用它。