簡體   English   中英

你如何用兩顆種子播種一個 PRNG?

[英]How do you seed a PRNG with two seeds?

對於我正在制作的游戲,其中太陽系具有 x 和 y 坐標,我想使用坐標來隨機生成該太陽系的特征。 最簡單的方法似乎是用兩個種子(x 和 y 坐標)播種一個隨機數生成器。 有沒有辦法從兩顆種子中獲得一顆可靠的種子,或者是否有一個好的 PRNG 需要兩顆種子並產生長時間?

編輯:我知道兩個數字之間的二元運算,但我試圖找到導致最少碰撞次數的方法? 加法和乘法很容易產生沖突。 但是異或呢?

為什么不以有意義的方式組合數字來生成種子。 例如,您可以添加它們,這可能足夠獨特,或者使用一點乘法將它們堆疊起來,例如:

seed = (x << 32) + y
seed1 ^ seed2

(其中^是按位異或運算符)

一個簡單的斐波那契 PRNG 使用 2 個種子,其中一個應該是奇數。 此生成器使用模數,即 10 的冪。周期長且不變,為模數的 1.5 倍; 因此對於模數 1000000 或 10^6,周期為 1,500,000。 簡單的偽代碼是:

Input "Enter power for 10^n modulus";m
Mod& = 10 ^ m
Input "Enter # of iterations"; n
Input "Enter seed #1"; a
Input "Enter seed #2"; b
Loop = 1
For loop = 1 to n
C = a + b
If c > m then c = c - m
A = b
B = c
Next

該發生器速度非常快,並提供了極好的均勻分布。 希望這可以幫助。

為什么不使用某種超級簡單的斐波那契算術或類似的東西來直接以 10 為基數生成坐標。使用兩個起始數字作為種子。 它不會產生適合蒙特卡洛或類似內容的隨機數,但它們應該適合游戲。 我不是程序員或數學家,也從未嘗試過編寫任何代碼,所以我無法為您完成......

編輯 - 像 f1 = 一些種子然后 f2 = 一些種子和 G = (sqrt(5) + 1) / 2 ....

然后某種循環。 Xn = Xn-1 + Xn-2 mod(G) mod(1)(應該產生一個介於 0 和 1 之間的小數)然后乘以任何數字並取最低有效數字

也許是為了防止衰減,只要需要產生數字......

f1 和 f2 將根據生成器自己的輸出重新播種的初始重新播種點,這將防止數字序列能夠由封閉表達式描述,因此......

如果計數器 = 初始重新播種點 f1 = Xn 和 f2 = Xn - 某事。 並且...重新播種點設置為天花板 Xn * 一些乘數。

所以當 Xn 和 Xn 的相同值時,它的周期應該結束 - 有些東西被重新輸入 f1 和 f2,至少在你為數字使用的任何位長的情況下都不應該發生這種情況。

......我的意思是,這是我最好的猜測......

您有什么理由要使用坐標嗎? 例如,您是否總是希望在同一坐標處生成的系統始終與在該特定坐標處生成的任何其他系統相同?

我建議使用更經典的方法,即使用當前時間進行播種,並使用其結果繼續生成您的偽隨機性。

如果您堅持使用坐標,我會建議串聯(正如我相信其他人所建議的那樣)。 至少你可以保證避免沖突,假設你沒有兩個系統處於相同的坐標。

我使用 George Marsaglia 的 PRNG 之一:

http://www.math.uni-bielefeld.de/~sillke/ALGORITHMS/random/marsaglia-c

它明確依賴於兩個種子,因此可能正是您正在尋找的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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