2

这是一个石头、纸、剪刀的游戏。我的问题是,如果我在私有 Random r = new Random(weapons.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()]);

 }

}

对比

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

 }
}
4

5 回答 5

8

r.nextInt()无论数组在那里,都会给你任何随机整数。当您打电话时,private Random r = newRandom(weapons.length);您实际上是在用 3 播种 RNG,而不是将上限设置为 3。

它可以为您提供 42、2,000,000、-10 等。该数组在位置 42 中没有元素,并且您会收到错误,因为 3 的种子总是会产生超出范围的随机值。如果它没有播种(即Random r=new Random()),那么获得有效值的机会很小,但这个机会非常小。

对于第二个,您正在选择一个带有 bound 的随机 int,即从 0 到数组的长度(不包括上限)。

所以对于你的:

{"rock", "paper", "scissor"};

rock 是元素 0,paper 是元素 1,scissors 是元素 2。 random.nextInt(weapons.length) 调用总是返回一个从 0 到 2 的 int(因为 3,长度不包括在内)。

于 2013-10-08T16:54:14.137 回答
3

第一个每次都会抛出 ArrayIndexOutOfBoundsException 。实际上它总是会抛出异常

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1155099828
    at Game.thePick(Game.java:11)

感谢@hexafraction 发现这一点。

第二种方法不会打印异常,而是随机选择。

于 2013-10-08T16:54:13.133 回答
0

第二个提供 0 - 2
的值第一个随机提供整个 int 范围,因此它实际上会抛出 ArrayOutOfBoundsException。
但是你为什么不试试呢?

于 2013-10-08T16:54:37.570 回答
0

您应该考虑阅读相应的 Javadocs:这是您在第一次尝试时调用的构造函数:http: //docs.oracle.com/javase/7/docs/api/java/util/Random.html#Random%28long% 29 你实际上是在提供一个种子,它没有得到指定范围内的随机数。这意味着对 .nextInt() 的调用将在应用程序的每次运行时返回相同的结果。

在您的第二次尝试中,您正在使用默认的 contrusctor(以当前时间作为种子初始化)并调用一个做正确事情的方法:http: //docs.oracle.com/javase/7/docs/api/java/util /Random.html#nextInt%28int%29

于 2013-10-08T16:57:28.233 回答
0

文档是一件很棒的事情。明智地使用它。

于 2013-10-09T00:08:31.230 回答