2013-06-24 143 views
2

我不禁注意到......在我開始開發我的數學遊戲(並且經過不斷的調整之後給了beta測試者,而且我還沒有完成!)之後,我使用了java.util.Random及其方法nextInt()雙可能不是我所期待的可靠的救世主課程。是否爲像我這樣的應用程序生成隨機數? //這個應用程序的重點在於製作一個算術遊戲,對所有人都具有挑戰性,並且可以讓你用整數和浮點參數解決問題。我的程序生成的最高數字是一個6位數的數字,這是因爲我用於人類計算器(最高級別)難度的一些不同邏輯,即分配問題。我正在考慮使用Mersenne Twister算法,但我認爲java.util.Random使用的算法如下所示:http://docs.oracle.com/javase/7/docs/api/java/util/Random.html#next%28int%29Java的java.util.Random是可靠的嗎?

另外,我想知道這是否會建議我用的是已經基於當前時間像new java.util.Random(System.currentTimeMillis())

+0

....定義「可靠」? – radai

+0

你也可以使用java.util.UUID –

+1

我相信你不應該使用'new java.util.Random(System.currentTimeMillis())',因爲種子將被限制在毫秒(甚至更大)的分辨率。 –

回答

6

Random的無參數的構造函數(通過其CPU nanoTime而不是UTC日期)所以創建它會每次都會給你一個不同的種子。種子Random(long)版本是(以我的經驗)主要用於當你想要可預測的輸出(一些電腦遊戲的程序生成例程,例如,允許玩家指定一個隨機種子)

如果你非常擔心隨機隨機數字,你可能想看看SecureRandom,推薦使用普通隨機進行加密等。有一個很好的解釋,如何使用它here和非常好的解釋,兩者之間的差異here

2

簡短回答:是的,java.util.Random應該罰款爲您的應用程序;並簡單地使用構造函數new java.util.Random(),沒有參數,也應該沒問題。

較長的答案:java.util.Random加密安全 - 有一個技術性的定義在這裏,但它本質上不是「隨機足夠的」安全讓人覺得使用它安全;攻擊者可能會猜測產生的隨機數。然而,它滿足另外兩個重要的性質:

  1. 類似於隨機分佈,即每個值可能相同地產生。
  2. 非確定性,即每次都會得到不同的值序列。

換句話說:你應該很好走。

3

其他答案有這個漂亮的覆蓋,特別是mfrankli關於統計隨機和密碼隨機差異的答案。在你的情況下,你真的只需要後者,所以java.util.Random是夠好的。

所有的說法,一個容易犯的錯誤(至少咬了我一次),在很短的時間內創建了很多Random實例。例如每次你需要一個隨機數時調用new Random()。您應該初始化Random一次,並儘可能重新使用它。由於Random從系統時間(即使是納米級)開始播種,因此在非常接近同一時間創建的一系列Random實例的輸出將不會均勻分佈。

+0

和你的建議正是我所做的! –

+0

+1,用於指出*我親自制作的「一個簡單的錯誤」*,並自此糾正了100多次。 –