1. 程式人生 > >C中隨機函式rand()使用時要注意的問題

C中隨機函式rand()使用時要注意的問題

rand();根據由time設定產生的隨機種子,返回一個隨機整型數值
rand()%100;產生0-99的隨機數,假如要產生a-b之間的數,你可以這樣寫:rand()%(b-a+1)+a
注意1:
   rand()每次的隨機數都一樣是因為rand()函式使用不正確。各種程式語言返回的隨機數(確切地說是偽隨機數)實際上都是根據遞推公式計算的一組數值,當序列足夠長,這組數值近似滿足均勻分佈。如果計算偽隨機序列的初始數值(稱為種子)相同,則計算出來的偽隨機序列就是完全相同的。這個特性被有的軟體利用於加密和解密。加密時,可以用某個種子數生成一個偽隨機序列並對資料進行處理;解密時,再利用種子數生成一個偽隨機序列並對加密資料進行還原。這樣,對於不知道種子數的人要想解密就需要多費些事了。當然,這種完全相同的序列對於你來說是非常糟糕的。要解決這個問題,需要在每次產生隨機序列前,先指定不同的種子,這樣計算出來的隨機序列就不會完全相同了。你可以在呼叫rand()函式之前呼叫srand( (unsigned)time( NULL ) ),這樣以time函式值(即當前時間)作為種子數,因為兩次呼叫rand函式的時間通常是不同的,這樣就可以保證隨機性了。你也可以使用srand函式來人為指定種子數。     
注意2: 例如:
    void fun()
    {
     for(int i=0;i<20000;i++)
     {
     srand( (unsigned)time( NULL ) );
     cout<<rand()<<endl;
     }
    } 
此程式的結果是產生一個等差數列,而不是真正的隨機數。
 這個程式是有問題的,每產生一個隨機數之前,都呼叫一次srand,而由於計算機執行很快,所以你每次用time得到的時間都是一樣的(time的時間精度較低,只有55ms)。這樣相當於使用同一個種子產生隨機序列,所以產生的隨機數總是相同的。你應該把srand放在迴圈外。
                                                                                                           【 此文部分借鑑於百度】