我最近在某個地方讀到,有效位數較少的數值往往比有效位數較多的數值隨機性要小,誰能更好地解釋一下這個問題?如果你能給我一些關于這個問題和亂數的論文,我將非常感激,只要它沒有大量復雜的數學知識
。uj5u.com熱心網友回復:
這是對用于C庫rand()函式的亂數生成器通常質量不佳的評論。它所回傳的數字應該是完全隨機的--也就是說,如果你要求一百萬個這樣的數字,你將無法找到一個模式來預測下一個數字。
但是,如果 rand() 使用了一種糟糕的演算法,就有可能在它回傳的數字中找到模式,并預測未來的數字,或者是未來數字的某些位。特別是,回傳數字的低階位(即代表2^0、2^1、2^2...的位)比高階位(代表2^31、2^30...的位)更容易預測。例如,我們可能會說,我們不知道下一個數字會是什么,但是它的低位有60%的可能性是1,而不是50%。
解決方法就是不要使用內置的rand()函式,而是使用一個可信的庫或演算法來生成亂數--而且永遠不要 "自己滾"(即撰寫自己的RNG)。
uj5u.com熱心網友回復:
這里有兩件事情在起作用。
首先是演算法。偽亂數發生器(PRNG)輸出的特定位是否比其他位 "弱",取決于演算法。例如,許多依靠線性遞回的PRNG(如許多線性全能發生器)將產生輸出,其位的周期越短,其意義越小。當所謂的 "模數 "是2的冪(或更普遍的是素數的冪)時,這種情況往往是最糟糕的。下面參考的第一篇論文回顧了線性全等生成器的理論,第二篇論文展示了這類生成器的一個特殊現象。
Steele和Vigna,計算簡單、頻譜良好的全能偽亂數生成器的乘數,2020/2021.
。
Durst, Using linear congruential generators for parallel random number generation, 1989 Winter Simulation Conference.
其次是C語言中rand(和srand)的性質,無論特定的rand實作所使用的演算法如何,這一點都是如此。也許最嚴重的是,rand并不保證偽亂數必須遵循一個特定的分布。欲了解更多資訊,請參閱。為什么使用rand()被認為是不好的?
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/331075.html
標籤:
上一篇:將@casl/mongoose和mongoose-paginate-v2結合使用
下一篇:為什么這個程式不能正確檢測模式?
