隨機數種子
回答
既然你問了一個例子:
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
隨機發生器是確定性的相同的序列。給定與Random相同的輸入和Random中的方法的相同用法,即使在不同機器上的不同運行中,返回到程序的僞隨機數序列也是相同的。
這就是爲什麼它是僞隨機的 - 數字返回表現爲統計上像隨機數,除非它們可以可靠地預測。真正的隨機數是不可預測的。
在給定相同的開始條件(種子)和相同的操作序列的情況下,這些數字並不是真正的隨機數,因此會生成相同的數字序列。這就是爲什麼使用基本的隨機類作爲任何密碼或安全相關代碼的一部分並不是一個好的選擇,因爲攻擊者有可能找出哪個序列正在產生並預測未來的數字。
對於發出非確定性值的隨機數生成器,請看SecureRandom。
請參閱Random number generation, Computational methods的維基百科瞭解更多信息。
具有相同的種子值,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 /米,其結果將是對於給定的種子相同。這可以用來在兩個地方生成相同的「隨機」數字,雙方都可以依靠獲得相同的結果。這對加密很有用。顯然,這種算法不具有密碼安全性。
Random類基本上是一個Psuedorandom數發生器(也稱爲確定性隨機位產生),其產生一個數字序列近似於隨機數的屬性。它通常不是隨機的,而是確定的,因爲它可以由發生器中的小隨機狀態來確定(例如seed
)。由於確定性本質,如果在2個生成器上的方法和種子序列相同,則可以生成相同的結果。
這意味着當你創建Random對象時(例如在你的程序開始時),你可能會希望從一個新的種子開始。大多數人選擇一些時間相關的價值,比如滴答的數量。
如果您想要調試程序,數字序列相同的事實實際上非常方便:確保記錄種子值,如果出現問題,可以使用調試器重新啓動程序相同的種子價值。這意味着您可以完全重播場景。如果你願意(可以)使用真正的隨機數生成器,這將是不可能的。
- 1. 隨機數 - 選擇種子
- 2. 隨機數種子4321 SPSS
- 3. Oracle sql隨機數種子
- 4. Java隨機種子
- 5. Lua隨機種子
- 6. 什麼是隨機種子隨種子提供種子?
- 7. 隨機種子生成
- 8. Java:隨機設置種子
- 9. 爲excel設置種子隨機數
- 10. 種子範圍內的隨機數
- 11. 如何保護隨機數種子?
- 12. 種子僞隨機數發生器
- 13. 在種子內生成隨機數
- 14. numpy中的隨機數種子
- 15. 生成隨機數字:更新種子
- 16. 將隨機數發生器種子設置爲一個「隨機」數
- 17. 生成 「隨機」 數是相同的javascript每次(即種子隨機數)
- 18. OpenCV隨機森林:設置隨機種子
- 19. 隨機訪問種子3D白噪聲隨機發生器
- 20. 什麼是隨機對象種子
- 21. 隨機:什麼是默認種子?
- 22. 柏林噪音的Python隨機種子
- 23. 隨機生成器,種子不工作
- 24. Python:隨機系統時間種子
- 25. numpy的隨機不帶種子
- 26. Z3 SAT求解器的隨機種子
- 27. python隨機模塊種子方法
- 28. 設置種子提升::隨機
- 29. 種子隨機繪製2D網格
- 30. C++爲psudo隨機數生成器生成一個很好的隨機種子
以下說法非常簡單。隨機r1,r2',使用相同的種子創建和初始化(參見文檔)。每次撥打'下一個'5次。他們將返回5個「隨機」數字的相同確切序列。 – polygenelubricants 2010-08-27 11:22:18