電腦隨機數初探

來源:互聯網
上載者:User

標籤:

研究過隨機數嗎?我們都知道電腦裡面的隨機數其實只是看上去是隨機的,產生的過程都是確定的。如果我們有一定的破解能力,我們就能預測得到,下一次機器產生的隨機數是哪個值。
在c++編程中,我們總要放一個隨機種子,這個種子一般是目前時間,這樣我們可以看到每次調用的隨機數工廠產生的數值是不一樣的。如果我們把隨機數植入為一個特定的數,那麼產生的隨機數也是固定的。這樣有一個好處,就是方便調試,因為調試的時候肯定不希望每次啟動並執行結果都不一樣。
#include<iostream>#include<ctime>#include <cstdlib>using namespace std;int main(){    srand(time(0));//time(0)返回目前時間傳到srand裡面做隨機種子    int x=rand();    }



但是在真正的計算中我們是希望隨機數儘可能真的是隨機出來的。所以又兩種方法
1用更好的隨機方法。演算法沒有最好的方法,就像排序演算法一樣,只有適合某種情形。
2用物理硬體:原子衰減檢測。電路中量子力學雜訊

0先告訴一個驚人的事實
c++ rand() 產生的隨機數在[0,RAND_MAX]之間的一個整數.這是一個均勻分布.如果我們希望產出[a,b]之間的隨機數通常會這麼處理
(rand()%(b-a+1))+a
這種演算法導致不是所以的值都是等機率出現的。只有當(b-a+1)可以整除RAND_MAX+1時才可以.假設RAND_MAX為32767那麼產生[0
32766]的時候0的機率是其他值出現機率的兩倍.一個解決的辦法就是先成[0,1]之間的一個值,在放縮到[a,b]區間上.
double v=(double)rand()/RAND_MAX;
result=(int)(V*(b-a))+a;//這裡一個書中給的代碼是(V*(b-a+1))+a,我認為是錯的,因為如果v=1的時候產生的值是b+1,如果我錯了請務必告訴我

1介紹一個常用的分布,
如果我們希望以高斯分布的機率產生隨機值,讓更多的值不要偏離中心太多,那麼該怎麼做?
一個簡單的方法(其實不簡單)用randf()產生[0,1]之間的實數隨機數,這個randf要自己編程,然後做BOX-Muller變換,這樣可以產生兩個隨機數(買一贈一),不知道那個鳥變換沒關係,我也不知道.
float x1,x2,w,y1,y2;do{    x1=2.0*randf()-1.0;    x2=2.0*randf()-1.0;    w=x1*x1+x2*x2;}while(w>=1.0);w=sqrt((-2.0*log(w))/w);y1=x1*w;y2=x2*w;



那麼問題來了。如何產生其他的分布?這個要用到中心極限定理。讀者可以自己看看資料

2介紹幾個不能用於加密的隨機數產生演算法
之所以說不能用於加密,是應用這種隨機數可能使資訊被破解的可能性大。
a線性同餘產生器
x_(n+1)=(a*x_(n)+b)%m
其中x_(n+1)就是新產生的隨機數,x_(n)是之前的數.n是零的話那個就是隨機種子吧!a,b是一個參數,m是一個2的次方數(這樣便於取餘).vb6中這個演算法的參數是m=2^24,a=16598013,b=12820163.

b截斷線性同餘產生器
先用a演算法產生一個隨機數,然後計算floor[x_(n+1)/k]。k是2的乘方把這個數返回。
當然還有其他的方法,線性反饋移位寄存器演算法,逆同餘產生器,滯後斐波那契產生器,元胞自動機,線性迴歸產生器,馬特賽旋轉法,well演算法。
3可用於加密的隨機數
blum blum shub演算法。isacc,isacc+。這些都是演算法,需要者自行百度。
/dev/random
這個是linux上的一個隨機源,他基於系統熵返回一個隨機數,可以看成一個真正的隨機數.因為產生隨機數需要系統收集資訊,在系統沒有足夠資訊的時候會造成阻塞。
微軟的CryptGenRandom
這個也可是被視為真正的隨機數,雖然未開源。

電腦隨機數初探

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.