2010-08-27 150 views
5

參考:link text隨機數種子

我不明白以下行,有誰能夠給我提供了下面的語句一些例子嗎?

如果隨機的兩個實例使用相同的種子創建,並且方法相同的調用序列由對於每個,它們將生成並返回號碼

+0

以下說法非常簡單。隨機r1,r2',使用相同的種子創建和初始化(參見文檔)。每次撥打'下一個'5次。他們將返回5個「隨機」數字的相同確切序列。 – polygenelubricants 2010-08-27 11:22:18

回答

11

既然你問了一個例子:

import java.util.Random; 
public class RandomTest { 
    public static void main(String[] s) { 
     Random rnd1 = new Random(42); 
     Random rnd2 = new Random(42); 

     System.out.println(rnd1.nextInt(100)+" - "+rnd2.nextInt(100)); 
     System.out.println(rnd1.nextInt()+" - "+rnd2.nextInt()); 
     System.out.println(rnd1.nextDouble()+" - "+rnd2.nextDouble()); 
     System.out.println(rnd1.nextLong()+" - "+rnd2.nextLong()); 
    } 
} 

兩個Random實例將始終具有相同的輸出,無論你如何經常運行它,無論你用什麼平臺或者什麼Java版本:

30 - 30 
234785527 - 234785527 
0.6832234717598454 - 0.6832234717598454 
5694868678511409995 - 5694868678511409995 
8

隨機發生器是確定性的相同的序列。給定與Random相同的輸入和Random中的方法的相同用法,即使在不同機器上的不同運行中,返回到程序的僞隨機數序列也是相同的。

這就是爲什麼它是僞隨機的 - 數字返回表現爲統計上像隨機數,除非它們可以可靠地預測。真正的隨機數是不可預測的。

2

在給定相同的開始條件(種子)和相同的操作序列的情況下,這些數字並不是真正的隨機數,因此會生成相同的數字序列。這就是爲什麼使用基本的隨機類作爲任何密碼或安全相關代碼的一部分並不是一個好的選擇,因爲攻擊者有可能找出哪個序列正在產生並預測未來的數字。

對於發出非確定性值的隨機數生成器,請看SecureRandom

請參閱Random number generation, Computational methods的維基百科瞭解更多信息。

0

具有相同的種子值,Random的單獨實例將返回/生成相同的隨機數序列;更多關於這個位置: http://www.particle.kth.se/~lindsey/JavaCourse/Book/Part1/Tech/Chapter04/javaRandNums.html

紅寶石實施例:

class LCG; def initialize(seed=Time.now.to_i, a=2416, b=374441, m=1771075); @x, @a, @b, @m = seed % m, a, b, m; end; def next(); @x = (@a * @x + @b) % @m; end; end 

irb(main):004:0> time = Time.now.to_i 
=> 1282908389 

irb(main):005:0> r = LCG.new(time) 
=> #<LCG:0x0000010094f578 @x=650089, @a=2416, @b=374441, @m=1771075> 
irb(main):006:0> r.next 
=> 45940 
irb(main):007:0> r.next 
=> 1558831 
irb(main):008:0> r.next 
=> 1204687 
irb(main):009:0> f = LCG.new(time) 
=> #<LCG:0x0000010084cb28 @x=650089, @a=2416, @b=374441, @m=1771075> 
irb(main):010:0> f.next 
=> 45940 
irb(main):011:0> f.next 
=> 1558831 
irb(main):012:0> f.next 
=> 1204687 

基於該值A/B /米,其結果將是對於給定的種子相同。這可以用來在兩個地方生成相同的「隨機」數字,雙方都可以依靠獲得相同的結果。這對加密很有用。顯然,這種算法不具有密碼安全性。

3

Random類基本上是一個Psuedorandom數發生器(也稱爲確定性隨機位產生),其產生一個數字序列近似於隨機數的屬性。它通常不是隨機的,而是確定的,因爲它可以由發生器中的小隨機狀態來確定(例如seed)。由於確定性本質,如果在2個生成器上的方法和種子序列相同,則可以生成相同的結果。

1

這意味着當你創建Random對象時(例如在你的程序開始時),你可能會希望從一個新的種子開始。大多數人選擇一些時間相關的價值,比如滴答的數量。

如果您想要調試程序,數字序列相同的事實實際上非常方便:確保記錄種子值,如果出現問題,可以使用調試器重新啓動程序相同的種子價值。這意味着您可以完全重播場景。如果你願意(可以)使用真正的隨機數生成器,這將是不可能的。