2012-04-07 16 views
2

有以生成Java隨機數隨機數字在Java中是否真的無法預知?

其中之一是這樣的一些方法:

Random rand=new Random(); 
int randomInteger=rand.nextInt(); 

現在我的問題是:我們可以預測下一個隨機數?


後4個答案編輯:

我真正的問題是這樣的:

我工作的一個蛇遊戲(在Linux下半字節)和我編程蛇動,現在我想知道是否有可能預測蘋果將出現的下一個地方。

是否有可能?

+0

更新我的答案以解決您的編輯問題。 – 2012-04-07 15:28:18

回答

5

如果您確切知道System.currentTimeMillis會在您撥打new Random()時返回,您不僅可以預測它,但絕對知道它,。這是因爲new Random()new Random(System.currentTimeMillis())的快捷鍵,它設置了僞隨機生成器的種子。 (好吧,這就是我上次查看源代碼時所做的事情;文檔don't actually say它必須使用它。)如果您知道new Random()使用的種子。僞隨機生成器是確定性的,如果你知道種子,你就知道序列。 更新:查看Java 6源代碼[我沒有Java 7源代碼的便利],默認種子是使用時增加的種子編號的組合,再加上System.nanoTime。所以你需要知道這兩個。提高酒吧。

如果知道System.currentTimeMillis()new Random()發生new Random()使用的種子的精確值,那麼它的非常困難確實來預測下一個值將是什麼。這就是僞隨機發生器的要點。我不會說這是不可能的。真的很難做到任何信心。


問題編輯後更新:這是可能,但非常,非常努力,並在某種程度上這樣的條款,將允許玩家提高自己在比賽中的分數,我說你可以忽略它。

2

由隨機類生成的「隨機」數字在算法上生成,因此實際上是僞隨機數。所以是的,從理論上講,你可以預測下一個數字。然而,知道隨機產生的一個數字,甚至是一系列數字,都不足以預測下一個數字;您還需要知道Random對象正在使用的種子,並且您需要遵循其僞隨機數生成算法。

如果您想要一組可重複的「隨機」數字,您可以在創建隨機實例時指定自己的種子,例如,

Random rand = new Random(1234); // Replace 1234 with any value you'd like 

每次使用相同的種子實例化Random時,您將得到相同的一系列數字。因此,例如,您可以編寫一個小的命令行程序,用一些種子實例化Random並打印返回的數字列表,然後在您的代碼中使用相同的種子實例化Random。然後你會知道你的代碼將以什麼順序接收哪些數字。這對於調試非常方便。

+0

另外,如果你需要真正的隨機數,有一些互聯網可訪問的服務,如http://www.random.org/,你可以查詢基於自然現象,如大氣噪聲的隨機數列表。 – MattK 2012-04-07 14:35:33

1

在計算機等確定性設備上可能沒有真正的隨機數。但。

如果你想有一個加密的安全隨機數,使用的SecureRandom:http://docs.oracle.com/javase/6/docs/api/java/security/SecureRandom.html

隨機使用確定的算法:

如果隨機的兩個實例使用相同的種子,以及同一序列的建立方法調用是爲每個方法調用的,它們將生成並返回相同的數字序列。

http://docs.oracle.com/javase/6/docs/api/java/util/Random.html#Random

+0

只有當您知道實施未在封面允許的範圍內使用PRNG時。 – 2012-04-07 14:34:47

0

從本質上講,如果你知道隨機數發生器的種子,你可以預測確切的整個序列。如果不這樣做,無論您生成多少個數字,都無法準確預測下一個數字。

請注意,如果您依賴的數字在安全性方面不可預知,則應該使用java.secure.SecureRandom而不是java.util.Random

0

正如其他人回答這個問題,如果你知道起始種子,可以預測java.util.Random的隨機性。

如果您正在使用Linux系統,請查看這些特殊文件/dev/randomdev/urandom。據說這些文件的讀取返回「更好」的隨機數,隨機性取決於鍵盤活動,鼠標移動和一些其他外來因素。

有關詳細信息,請參閱此Wikipedia頁面。這個頁面還說在Windows中存在等效的API。