單片機隨機數(shù):rand(),srand()
- 求0~max;
- 求min~max;
int rand_with_min_max(int min,int max)
{
return ((rand()/max) + min);
}
int rand_with_min(int min)
{
srand(min);
return rand();
}
int rand_with_max(int max)
{
return (rand()/max);
}
srand()就是給rand()提供種子seed
如果srand每次輸入的數(shù)值是一樣的,那么每次運行產(chǎn)生的隨機數(shù)也是一樣的,
srand(n)
for(10)
rand()
也就是說,以一個固定的數(shù)值作為種子是一個缺點。 通常的做法是以這樣一句代碼srand((unsigned) time(NULL));來取代,這樣將使得種子為一個不固定的數(shù), 這樣產(chǎn)生的隨機數(shù)就不會每次執(zhí)行都一樣了。
1,先看一個例子
#include
#include
#include
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中包含很多有趣的函數(shù),譬如
char *ctime(long *clock)
本函數(shù)把clock所指的時間(如由函數(shù)time返回的時間)轉換成下列格式的
字符串:Mon Nov 21 11:31:54 1983/n/0
#i nclude
#i nclude
#i nclude
using namespace std;
void main()
{
time_t t1,t2;
char getTime[20];
char *ptstring=getTime;
int x,count=0;
x=RAND_MAX;
cout<<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 "<<}
}
查看ptstring的值會顯示 "Tue Sep 13 16:31:06 2005"
3, 最后說說srand()函數(shù)
void srand(unsigned seed) 初始化隨機數(shù)發(fā)生器
有討論如下:
1.C的函數(shù)庫之所以沒有把使用系統(tǒng)時鐘初始化隨機種子這步重要的操作直接放進ran
d函數(shù)的實現(xiàn)中,我覺得至少有三個原因:
(1)可以高效產(chǎn)生連續(xù)的隨機數(shù),不用每次都初始化;
(2)給程序員以更高的靈活性,因為可能在要求較高的場合,應該使用更好的的數(shù)據(jù)
做種子,而不是系統(tǒng)時鐘;
(3)對于只是想產(chǎn)生大量偽隨機數(shù)來盡興某種驗證或者統(tǒng)計,未必需要初始化,大不
了程序每次運行都產(chǎn)生同樣的一系列隨機數(shù)而已——有些情況下,這是無所謂的。
事實上有一個更重要的原因:
作為偽隨機序列產(chǎn)生器的rand()函數(shù),必須具備的一個重要特性就是-》產(chǎn)生的序
列必須是可重現(xiàn)的。
這不僅僅是一個算法,相當大的程度上,它關系到代碼測試的準確性。如果算法中
使用了和rand()的結果相關的數(shù)據(jù),通過一個可控的可重現(xiàn)序列,我們就有機會再現(xiàn)每一
次測試的過程,從而更有效的找到問題的所在。
所以這里提出一個建議,代碼中,如果rand()的函數(shù)結果關系到算法的結果,那么
,必須保證你的rand()調用是可重現(xiàn)的。
4,c語言里函數(shù)rand()和srand()的用法 - -
rand(void)用于產(chǎn)生一個偽隨機unsigned int 整數(shù)。
srand(seed)用于給rand()函數(shù)設定種子。
srand 和 rand 應該組和使用。一般來說,srand 是對 rand 進行設置。
比如:
srand((UINT)GetCurrentTime());
int x = rand() % 100;
是生成 0 到 100 之間的隨機數(shù)。
srand()是用來初始化隨機種子數(shù)的,因為rand的內部實現(xiàn)是用線性同余法做的,他不是真
的隨機數(shù),只不過是因為其周期特別長,所以有一定的范圍里可看成是隨機的,式子如下
:
rand = rand*const_1 + c_var;
srand函數(shù)就是給它的第一個rand值。
用"int x = rand() % 100;"來生成 0 到 100 之間的隨機數(shù)這種方法是不或取的,
比較好的做法是: j=(int)(n*rand()/(RAND_MAX+1.0)) 產(chǎn)生一個0到n之間的隨機
數(shù)
RAND_MAX=0x7fffffff
5.總結
1)srand()給rand()提供種子
2)srand()中的seed一般由時間函數(shù)得,eg srand((UINT)GetCurrentTime()) srand( (u
nsigned)time( NULL ) ) time()函數(shù)得到現(xiàn)在的系統(tǒng)時間...等等
評論