2012-01-10 36 views
1

我想建立一個PRNG字節,我可以採取一組字節(比如10或15字節),並返回一個種子列表產生該字節列表。我不關心密碼學,但它必須大致均勻分佈,它必須達到所有可能的2^8組合,並且它必須偶爾能夠重複數字而不會卡住。試圖寫一個可翻轉的PRNG的8位,而不是一個密碼

問題是,我讀過的大多數算法都使用密碼,這可能意味着它不會允許重複,或者他們使用模數或非循環移位來誘導丟失,並且使得函數在最佳情況下不切實際。另外,如果算法使用計數,那麼將很難反向工作,因爲字節列表輸入不知道內部PRNG的計數器在生成時是什麼。

我意識到我在尋找的是一個有你的蛋糕和吃它太局面,但我想確保沒有另一個我失蹤的解決方案。

雖然搜索我遇到了this post它有類似的要求。我用C#編寫,但實際上,語法並不重要。

我試圖自己編寫的每種算法都是密碼,因此無法在分發中重複和/或不統一。我使用了反轉,循環移位和種子遮蔽。

+0

您引用的帖子似乎回答您的問題。 – 2012-01-11 02:19:04

+0

該線程的答案使用密碼,除非我錯過了某些東西,否則不會允許重複輸出而不被卡住。 – digdig 2012-01-11 15:58:51

回答

1

這是行不通的嗎?

#include <stdio.h> 

int seed = 1; 

int next() { 
    seed = 1664525*seed + 1013904223; 
    return (seed & 0xff)^(seed>>8 & 0xff)^(seed>>16 & 0xff)^(seed>>24 & 0xff); 
} 

int main() { 
    int i; 
    for(i = 0; i < 1000; i++) { 
     printf("%d\n", next()); 
    } 
} 

由於它是基於線性同餘發生器(LCG)一個完整的週期,每個字節將被每個種子產生,最終。似乎有重複。它繼承了基礎LCG的一致性。

+0

我看到的主要問題是,這種轉移通過僅使用部分種子而導致損失,從而留下數百萬種可能的組合。除非我錯過了某些東西,否則從種子到字節的轉換是不可逆的,但除此之外我喜歡它。 – digdig 2012-01-16 22:31:10

0

我的顧問修改了一個PRNG(基於L'Ecuyer的clcg4)是可逆的,以支持我們集團的HPC模擬工作。你可以閱讀這些here

基本上,它「解除了」已經完成的任務,並且正如您可能已經猜到的那樣,這可能需要「撤銷」隨機數生成,然後再沿不同的計算路徑重新生成這些相同的值。你可以看看這個代碼herehere。它是BSD授權代碼。

相關問題