天天看點

srand&rand function application of c/c++

rand和srand的用法 :

首先我們要對rand&srand有個總體的看法:rand即random之意, srand(即startup rand)初始化随機種子,rand産生随機數,下面将詳細說明。 

rand(産生随機數) 

表頭檔案: #include <stdlib.h>

定義函數 :int rand(void) 

函數說明 : 

因為rand的内部實作是用 線性同餘法做的, 他不是真的随機數,隻不過是因為其周期特别長,是以有一定的範圍裡可看成是随機的,rand()會傳回一随機數值,範圍在0至RAND_MAX 間。在調用此函數産生随機數前,必須先利用srand()設好随機數種子, 如果未設随機數種子,rand()在調用時會自動設随機數種子為1。rand ()産生的是假随機數字,每次執行時是相同的。若要不同,以不同的值來初始化它.初始化的函數就是srand()。 

傳回值: 

傳回0至RAND_MAX之間的随機整數值,RAND_MAX的範圍最少是在32767之間(int),即雙位元組(16位數)。若用unsigned int 雙位元組是65535,四位元組是4294967295的整數範圍。 

0~RAND_MAX每個數字被選中的機率是相同的。

範例: 

#include 

main() 

int i,j; 

for(i=0;i<10;i++) 

j=1+(int)(10.0*rand()/(RAND_MAX+1.0)); 

printf("%d ",j); 

執行: 

9 4 8 8 10 2 4 8 3 6 

9 4 8 8 10 2 4 8 3 6 //再次執行仍然産生相同的随機數 

srand(設定随機數種子) 

表頭檔案:#include 

定義函數:void srand (unsigned int seed); 

函數說明: 

srand()用來設定rand()産生随機數時的随機數種子。參數seed必須是個整數,通常可以利用geypid()或time(0)的傳回值來當做seed。如果每次seed都設相同值,rand()所産生的随機數值每次就會一樣。 

範例 

#include 

#include 

main() 

int i,j; 

srand((int)time(0)); 

for(i=0;i<10;i++) 

j=1+(int)(10.0*rand()/(RAND_MAX+1.0)); 

printf(" %d ",j); 

執行:與rand範例比較 

5 8 8 8 10 2 10 8 9 9 

2 9 7 4 10 3 2 10 8 7 

又或: 

用"int x = rand() % 100;"來生成 0 到 100 之間的随機數這種方法是不或取的,比較好的做法是: j=(int)(n*rand()/(RAND_MAX+1.0))産生一個0到n之間的随機數 

int main(void) 

int i; 

time_t t; 

srand((unsigned) time(&t)); 

printf("Ten random numbers from 0 to 99/n/n"); 

for(i=0; i<10; i++) 

printf("%d/n", rand() % 100); 

return 0; 

除以上所說的之外,補充一點就是srand這個函數一定要放在循環外面或者是循環調用的外面,否則的話得到的是相同的數字。 

MSDN中的例子。 

// crt_rand.c 

// This program seeds the random-number generator 

// with the time, then displays 10 random integers. 

// 

#include 

#include 

#include 

int main( void ) 

int i; 

// Seed the random-number generator with current time so that 

// the numbers will be different every time we run. 

// 

srand( (unsigned)time( NULL ) ); 

// Display 10 numbers. 

for( i = 0; i < 10;i++ ) 

printf( " %6d/n", rand() ); 

printf("/n"); 

// Usually, you will want to generate a number in a specific range, 

// such as 0 to 100, like this: 

int RANGE_MIN = 0; 

int RANGE_MAX = 100; 

for (i = 0; i < 10; i++ ) 

int rand100 = (((double) rand() / 

(double) RAND_MAX) * RANGE_MAX + RANGE_MIN); 

printf( " %6d/n", rand100); 

總結: 

我們知道rand()函數可以用來産生随機數,但是這不是真真意義上的随機數,是一個僞随機數,是根據一個數,我們可以稱它為種了,為基準以某個遞推公式推算出來的一系數,當這系列數很大的時候,就符合正态公布,進而相當于産生了随機數,但這不是真正的随機數,當計算機正常開機後,這個種子的值是定了的,除非你破壞了系統,為了改變這個種子的值,C提供了 srand()函數,它的原形是void srand( int a) 功能是 

初始化随機産生器既rand()函數的初始值,即使把種子的值改成a; 從這你可以看到通過sand()函數,我們是可以産生可以預見的随機序列, 

那我們如何才能産生不可預見的随機序列呢?我們可能常常需要這樣的随機序列,是吧。利用srand((unsign)(time(NULL))是一種方法,因為每一次運作程式的時間是不同的,對了,你知道time() 函數的功能是傳回從1970/01/01到現在的秒數的吧,可能這個起始時間不正确,你查一下對不對吧,C還提供了另一個更友善的函數, randomize() 

原形是void randomize(),功能是用來始初rand() 的種子的初始值,而且該值是不确定的,它相當于srand((unsign)(time(NULL)) 不過應注意的是randomize()的功能要通過time來實作是以在調用它時頭檔案要包含time.h罷了

繼續閱讀