srand()以及rand()函數用法


srand()就是給rand()提供種子seed

如果srand每次輸入的數值是一樣的,那么每次運行產生的隨機數也是一樣的,

srand(n)

for(10)

rand()
也就是說,以一個固定的數值作為種子是一個缺點。 通常的做法是  以這樣一句代碼srand((unsigned) time(NULL));來取代,這樣將使得種子為一個不固定的數, 這樣產生的隨機數就不會每次執行都一樣了。


1,先看一個例子 
#include <iostream> 
#include <stdlib.h> 
#include <time.h> 
using namespace std; 
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() ); 
}

2.關於time.h 
time.h中包含很多有趣的函數,譬如 
char *ctime(long *clock) 
本函數把clock所指的時間(如由函數time返回的時間)轉換成下列格式的 
字符串:Mon Nov 21 11:31:54 1983/n/0

#i nclude <iostream> 
#i nclude <stdlib.h> 
#i nclude <time.h> 
using namespace std;


void main() 

time_t t1,t2; 
char getTime[20]; 
char *ptstring=getTime;

int x,count=0; 
x=RAND_MAX; 
cout<<<'/n'; 
t1=time(NULL); 
ptstring=ctime(&t1);

while(count<=100) 

srand( (unsigned)time( NULL ) ); 
x=rand()%50; 
if(x<5) 
continue; 
else 

count++; 
cout<<"the numth is "<<<'/n'; 

}

查看ptstring的值會顯示 "Tue Sep 13 16:31:06 2005"

3, 最后說說srand()函數 
void srand(unsigned seed) 初始化隨機數發生器

有討論如下: 
1.C的函數庫之所以沒有把使用系統時鍾初始化隨機種子這步重要的操作直接放進ran

d函數的實現中,我覺得至少有三個原因: 
(1)可以高效產生連續的隨機數,不用每次都初始化; 
(2)給程序員以更高的靈活性,因為可能在要求較高的場合,應該使用更好的的數據

做種子,而不是系統時鍾; 
(3)對於只是想產生大量偽隨機數來盡興某種驗證或者統計,未必需要初始化,大不

了程序每次運行都產生同樣的一系列隨機數而已——有些情況下,這是無所謂的。

事實上有一個更重要的原因: 
作為偽隨機序列產生器的rand()函數,必須具備的一個重要特性就是-》產生的序

列必須是可重現的。 
這不僅僅是一個算法,相當大的程度上,它關系到代碼測試的准確性。如果算法中

使用了和rand()的結果相關的數據,通過一個可控的可重現序列,我們就有機會再現每一

次測試的過程,從而更有效的找到問題的所在。 
所以這里提出一個建議,代碼中,如果rand()的函數結果關系到算法的結果,那么

,必須保證你的rand()調用是可重現的。

4,C語言里函數rand()和srand()的用法 - -

rand(void)用於產生一個偽隨機unsigned int 整數。 
srand(seed)用於給rand()函數設定種子。

srand 和 rand 應該組和使用。一般來說,srand 是對 rand 進行設置。 
比如: 
srand((UINT)GetCurrentTime()); 
int x = rand() % 100; 
是生成 0 到 100 之間的隨機數。

srand()是用來初始化隨機種子數的,因為rand的內部實現是用線性同余法做的,他不是真

的隨機數,只不過是因為其周期特別長,所以有一定的范圍里可看成是隨機的,式子如下

: 
rand = rand*const_1 + c_var; 
srand函數就是給它的第一個rand值。

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


RAND_MAX=0x7fffffff

5.總結 
1)srand()給rand()提供種子 
2)srand()中的seed一般由時間函數得,eg srand((UINT)GetCurrentTime()) srand( (u

nsigned)time( NULL ) ) time()函數得到現在的系統時間...等等


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM