1. 程式人生 > >C語言中的隨機數問題

C語言中的隨機數問題

C語言函式庫中包含了一個產生隨機數的函式:int rand( void ); 函式返回的是一個界於0~32767之間的偽隨機數,包括0和32767。但是,這裡產生的是偽隨機數,不是真正意義上的隨機數,看下面的程式:

#include "stdlib.h" 

#include "stdio.h" 

void main( ) 

printf( " %d\n",rand() ); 

執行結果:41

多次執行程式,發現每次執行結果均相同(不同的計算機執行結果可能不同),這說明這種方法產生的隨機數並不是一個真正隨機的數,而是一個偽隨機數。這是因為C語言中,隨機數表有很多列,srand函式是根據其引數(unsigned型別)來獲得一個種子(seed),根據種子來設定從哪一列開始取隨機數。rand無引數,返回一個相應的隨機數。種子相同,則從同一列隨機數中選取,rand每次選取之後會自動選取下一個隨機數。如果srand設定的種子相同,則會從同一列隨機數中選取。

那麼,如何產生一個真正意義的隨機數呢?

問題的關鍵在於種子的選取。我們的目的是要在不同的時間生成不同的隨機數。因此,只要有一個只和時間有關的數,將其傳遞給srand,就可以達到目的了。這樣的函式位於time.h標頭檔案中。函式名即為time。呼叫time會返回一個和時間有關的整數。

例如,執行下面的程式:

#include "stdlib.h" 
#include "stdio.h" 
#include "time.h" 
void main() 
{    
int i;    /*將當前時間設定成隨機函式的種子,所以每次產生的數都不一樣*/  
srand( (unsigned)time( NULL ) );   /* 輸出10個隨機數*/  
for( i = 0; i < 10;i++ )     
printf( "%d\n", rand() );

結果為

20333
21010
16307
24721
8549
4749
2651
20114
5814
30943

再次執行程式,結果為:

20555
31006
18655
22627
21812
9622
17690
17668
14490
6090

每次執行程式得到的隨機數均不同,達到了隨機數的要求。

容易得知,A=rand()%x+y則表示產生一個x~x+y之間的隨機數。

如果要輸出1~10的隨機數,可寫為printf( "%d\n", rand() %10+1);

例如,

int a;

a=rand()%89+10;

執行該語句後,a即可得到一個10~100之間的整數賦值。

到x+y之間的隨機數。