標籤:

產生(偽)隨機數有哪些方法(原理)?

真、偽都行,最好講明原理。


維基上有個(偽)隨機數發生器的列表,可一一查閱。

http://en.wikipedia.org/wiki/List_of_random_number_generators

程序中最常用的是線性同餘法(LCG)。

個人認為最靠譜的是量子隨機發生器。


補充一下,量子隨機發生器:一個光穿過分束器,50%概率各走一邊,一邊定義0,另一邊定義1,就可以產生隨機數了。隨機的規律就是量子物理中幾率波的規律。

現在已有基於此的商用的真隨機發生器:像小晶元一樣,裡面集成了脈衝光源和探測部分,加外電路以後就會像上面那樣不停產生隨機數。裡面還集成了存儲器,目前的速率大概能到1M,公司是id quantique。


sheldon ross教授的simulation那本書里講的很詳細。。國內翻譯版叫隨機模擬。


可以看這個:

http://www.luocong.com/articles/show_article.asp?Article_ID=24

我比較好奇隨機數的 種子 是怎麼產生的,不知道是硬體還是軟體產生的

如果是軟體,可以用時間的平方,取後兩位(或其他),就生成了隨機數


隨機數生成上面都說了,這裡不扯開,我聊一下偽隨機。

如果你的需求是:

事件A,發生機率為1/100。 那麼100次內,事件必定發生。

那麼,偽隨機數生成演算法就可以是:

bool Get(int fail_times = 0, float p = 0.01f)

{

return (Random.Next(0, 100 - failtimes) &< p*100)

}

甚至,你可以給這個fail_times,加上一些更奇怪的約束。

bool Get(int fail_times = 0, float p = 0.01f)

{

int fiction = fail_times * fail_times * 0.01; // y = 1/100 * x^2

return (Random.Next(0, 100 - fiction) &< p*100)

}

又或者是

int fiction = Power(fail_times, 0.5) * 10; // y = 10 * x^0.5

上面給出的3段代碼,都能夠實現"100次內,概率1/100的事件,必定發生"

其區別是,必定發生的更早,或更晚。

所以,偽隨機的理論,簡單的理解,就是:

使用線形/非線性的手段,重置隨機數生成過程,使得人類能更好的理解隨機這個概念。


http://www.matrix67.com/blog/archives/2653


最簡單的方法就是根據當前的系統時間來產生吧


推薦閱讀:

神奇的數字循環?
淺談C-R條件
如何高效學好數學?
數學在金融中的具體如何應用?

TAG:數學 | 隨機 |