簡體   English   中英

我可以從Mersenne Twister獲得當前的種子嗎?

[英]Can I get the current seed from a Mersenne Twister?

我正在我的應用程序中調整Mersenne Twister,特別mt19937ar.c來自http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/MT2002/emt19937ar.html的 mt19937ar.c - 代碼已鏡像在https://gist.github.com/mstum/8367363上

這被用作游戲中的確定性RNG,並且為了使保存游戲按預期工作,我需要將當前種子從MT(而不是初始種子)中取出以便我可以恢復。

例如,假設我用種子12345初始化它並調用genrand_int31 5次。 這產生序列1996335345, 1911592690, 679411342, 280691776, 394962642

現在,想象一下我在第三個數字( 679411342 )之后保存了游戲,然后重新加載並得到兩個隨機數。 我希望這些數字是序列的下兩個數字( 280691776, 394962642 ),為此,我需要在第三次迭代后知道種子。

作為一種解決方法,我有初始種子和我調用RNG的次數,所以現在加載游戲會使初始種子旋轉MT並“重放” genrand_int31但是數百或數千次 - 這有點兒愚蠢的:)

我試過簡單地使用mt[N]數組的第一個元素,但這確實不起作用。 不幸的是,我不明白Mersenne Twister背后的數學就足以弄明白它究竟是什么了。

這兩個是MT生成器的狀態,您可以保存這些並恢復它:

static unsigned long mt[N]; /* the array for the state vector  */
static int mti=N+1; /* mti==N+1 means mt[N] is not initialized */

也許你需要修改C的原始源代碼。

另外我不相信存在任何可以等同於MT的任意狀態的種子:種子本身包含64位,這使得它可能達到2 ^ 64個值,這遠遠小於MT可能具有的狀態(它的時期是2 ^ 19937-1)

EIDTED:

作為一種解決方法,我有初始種子和我調用RNG的次數,所以現在加載游戲會使初始種子旋轉MT並“重放”genrand_int31但是數百或數千次 - 這有點兒愚蠢的:)

嗯,這不是太愚蠢。 :)讓我告訴你,在MT的數學背后,你可以恢復其連續輸出周期的內部狀態,確切的數字是624 - 你只需要保存genrand_int32最近的624個數字。 我正在尋找任何現有材料。

再次編輯:

破解隨機數生成器 - 第3部分展示了如何推導MT生成器的內部狀態,其中包含一些(少至624個)輸出數。 這並不是出乎意料,因為MT的設計強大的統計隨機性,而不是安全性作為加密的東西。
但是我想在這種情況下解決問題的最簡單方法是將自己的代碼添加到MT生成器中以保存/恢復其內部狀態。

暫無
暫無

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

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