2013-10-08 151 views
2

這是一個岩石,紙,剪刀遊戲。我的問題是,如果我在 私人隨機數r =新的隨機(weapons.length)移動weapons.length;它會給我一個錯誤。如果我在方法內移動了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()]); 

} 

} 

VS

​​
+0

運行,你會看到 – stinepike

回答

3

第一個將拋出ArrayIndexOutOfBoundsException異常每一次。事實上,它總是會拋出異常

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

謝謝@hexafraction發現。

第二種方法將不打印例外,相反,它只會選擇一個隨機的選擇。

+2

「但會在10億次中隨機工作1次。」不,OP每次播種都會有相同的不幸值。 – hexafraction

+0

@hexafraction斑點。 –

8

r.nextInt()會給你任何隨機整數,無論​​陣列在那裏的。當你打電話給private Random r = newRandom(weapons.length);時,你實際上是用3播種RNG,而不是設置3的上限。

它可以給你42,2,000,000,-10等等。該數組沒有元素在位置42,你會得到一個錯誤,因爲3的種子總是會產生一個超出範圍的隨機值。如果不是種子(即​​)再有就是得到一個有效值的機會渺茫,但這樣的機會是非常小的。

對於第二,你是picking a random int with a bound,即從0到陣列的長度(不包括上限)。

因此,對於你:

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

岩石是元素0,紙是元件1,和剪刀是元件2 random.nextInt(weapons.length)調用總是返回int從0到2(作爲3,長度,不包括在內)。

0

第二個提供的值爲0 - 2
第一個隨機數在整個int範圍內傳遞,所以它實際上會拋出一個ArrayOutOfBoundsException。
但是,爲什麼你不嘗試一下?

0

你應該考慮讀各自的Javadoc: 這裏是你調用你的第一次嘗試構造: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

相關問題