![](/img/trans.png)
[英]Do Linux and Windows java compilers produce the same or different class files?
[英]Do Java Random instances with different seeds really produce different sequences, or do they start at different places in the same sequence?
想象一下用兩個不同的種子rA和rB實例化兩個Random 。 查看rA生成的第一個整數是什么。 然后在rB上調用nextInt(),直到獲得相同的整數。
groovy:000> rA = new Random()
===> java.util.Random@463b4ac8
groovy:000> rB = new Random(1)
===> java.util.Random@5644dc81
groovy:000> rA_0 = rA.nextInt()
===> -1458003306
groovy:000> rB_0 = rB.nextInt()
===> -1155869325
groovy:000> for (int rB_n = rB.nextInt(); rB_n != rA_0; rB_n = rB.nextInt());
===> null
可以說,這兩個實例現在已經“同步”了,這樣它們將產生無限期向前的相同整數序列?
groovy:000> rA.nextInt()
===> 1701960179
groovy:000> rB.nextInt()
===> 1760857409
groovy:000> for (int rB_n = rB.nextInt(); rB_n != rA_0; rB_n = rB.nextInt());
===> null
groovy:000> rB.nextInt()
===> 614305687
顯示的有限實驗沒有發現序列的這種沖突,但是很難知道是否可以找到這種沖突。
換一個問題,我們是否要處理一個很長的序列,種子決定了我們從該序列開始的位置,還是可以依靠具有不同種子的隨機實例來產生完全不同的數字序列? 或更糟糕的是, 某些種子共享序列嗎? (還是取決於薩莉在哪個海岸上出售貝殼?)
Random.next()
Java Random.next()
(它是所有公共nextX()
方法的基礎)必須遵循以下LCG公式:
(x * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1)
因此,給定當前狀態( x
),則完全確定下一個狀態。
因此,假設這是一個“全周期” LCG(即,對所有可能的值進行迭代),那么必須是rB
最終達到rA
的起始狀態的情況。 到那時,其輸出序列將與rA
匹配。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.