簡體   English   中英

具有不同種子的Java Random實例確實會產生不同的序列,還是它們以相同的序列在不同的地方開始?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM