有以生成Java隨機數隨機數字在Java中是否真的無法預知?
其中之一是這樣的一些方法:
Random rand=new Random();
int randomInteger=rand.nextInt();
現在我的問題是:我們可以預測下一個隨機數?
後4個答案編輯:
我真正的問題是這樣的:
我工作的一個蛇遊戲(在Linux下半字節)和我編程蛇動,現在我想知道是否有可能預測蘋果將出現的下一個地方。
是否有可能?
有以生成Java隨機數隨機數字在Java中是否真的無法預知?
其中之一是這樣的一些方法:
Random rand=new Random();
int randomInteger=rand.nextInt();
現在我的問題是:我們可以預測下一個隨機數?
後4個答案編輯:
我真正的問題是這樣的:
我工作的一個蛇遊戲(在Linux下半字節)和我編程蛇動,現在我想知道是否有可能預測蘋果將出現的下一個地方。
是否有可能?
如果您確切知道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()
使用的種子的精確值,那麼它的非常困難確實來預測下一個值將是什麼。這就是僞隨機發生器的要點。我不會說這是不可能的。真的很難做到任何信心。
問題編輯後更新:這是可能,但非常,非常努力,並在某種程度上這樣的條款,將允許玩家提高自己在比賽中的分數,我說你可以忽略它。
由隨機類生成的「隨機」數字在算法上生成,因此實際上是僞隨機數。所以是的,從理論上講,你可以預測下一個數字。然而,知道隨機產生的一個數字,甚至是一系列數字,都不足以預測下一個數字;您還需要知道Random對象正在使用的種子,並且您需要遵循其僞隨機數生成算法。
如果您想要一組可重複的「隨機」數字,您可以在創建隨機實例時指定自己的種子,例如,
Random rand = new Random(1234); // Replace 1234 with any value you'd like
每次使用相同的種子實例化Random時,您將得到相同的一系列數字。因此,例如,您可以編寫一個小的命令行程序,用一些種子實例化Random並打印返回的數字列表,然後在您的代碼中使用相同的種子實例化Random。然後你會知道你的代碼將以什麼順序接收哪些數字。這對於調試非常方便。
另外,如果你需要真正的隨機數,有一些互聯網可訪問的服務,如http://www.random.org/,你可以查詢基於自然現象,如大氣噪聲的隨機數列表。 – MattK 2012-04-07 14:35:33
在計算機等確定性設備上可能沒有真正的隨機數。但。
如果你想有一個加密的安全隨機數,使用的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
只有當您知道實施未在封面允許的範圍內使用PRNG時。 – 2012-04-07 14:34:47
從本質上講,如果你知道隨機數發生器的種子,你可以預測確切的整個序列。如果不這樣做,無論您生成多少個數字,都無法準確預測下一個數字。
請注意,如果您依賴的數字在安全性方面不可預知,則應該使用java.secure.SecureRandom
而不是java.util.Random
。
正如其他人回答這個問題,如果你知道起始種子,可以預測java.util.Random
的隨機性。
如果您正在使用Linux系統,請查看這些特殊文件/dev/random
和dev/urandom
。據說這些文件的讀取返回「更好」的隨機數,隨機性取決於鍵盤活動,鼠標移動和一些其他外來因素。
有關詳細信息,請參閱此Wikipedia頁面。這個頁面還說在Windows中存在等效的API。
更新我的答案以解決您的編輯問題。 – 2012-04-07 15:28:18