C++:rand()函数和srand()函数解读
(1)srand(unsigned int t)這個是設(shè)定種子。
因為電腦取隨機數(shù)是偽隨機,只要種子一樣,則取出來的數(shù)一定一樣。
這里用time(0)這個內(nèi)函數(shù),copy則是返回了當(dāng)前的時間值。
這個值是按照時間而變化的,所以,srand(unsigned(time(NULL)))這個函數(shù)的作用,就是一個簡單的設(shè)定隨機數(shù)的種子方法。通過這個函數(shù),可以得到每次都不容一樣zd的隨機數(shù)。
time(0)或者time(1)指c++中的一種函數(shù)。其作用是返回一特定時間的小數(shù)值。
time(0)指函數(shù)返回當(dāng)前時間,如果發(fā)生錯誤返回0。
time(1)指函數(shù)返回當(dāng)前時間,如果發(fā)生錯誤返回1。
(2)srand()就是給rand()提供種子seed。
如果srand每次輸入的數(shù)值是一樣的,那么每次運行產(chǎn)生的隨機數(shù)也是一樣的。
以一個固定的數(shù)值作為種子是一個缺點。通常的做法是 :以這樣一句srand((unsigned) time(NULL));來取代,這樣將使得種子為一個不固定的數(shù),這樣產(chǎn)生的隨機數(shù)就不會每次執(zhí)行都一樣了。
rand(void)用于產(chǎn)生一個偽隨機unsigned int 整數(shù)。?
srand(seed)用于給rand()函數(shù)設(shè)定種子。
srand 和 rand 應(yīng)該組合使用。一般來說,srand 用于對 rand 進(jìn)行設(shè)置。?
-------------------------------
一、rand()
? 函數(shù)名: ? rand ??
? 功 ? 能: ? 隨機數(shù)發(fā)生器?
? 用 ? 法: ? int rand(void); ?
? 所在頭文件: stdlib.h
? 函數(shù)說明 :
? ? ? ? ? ? ? ? rand()的內(nèi)部實現(xiàn)是用線性同余法做的,它不是真的隨機數(shù),因其周期特別長,故在一定
? ? ? ? ? ? ? ? 的范圍里可看成是隨機的。
? ? ? ? ? ? ? ? rand()返回一隨機數(shù)值的范圍在0至RAND_MAX 間。RAND_MAX的范圍最少是在32767之間(int)。用?
? ? ? ? ? ? ? ? unsigned int 雙字節(jié)是65535,四字節(jié)是4294967295的整數(shù)范圍。0~RAND_MAX每個數(shù)字被選中
? ? ? ? ? ? ? ? 的機率是相同的。 ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? 用戶未設(shè)定隨機數(shù)種子時,系統(tǒng)默認(rèn)的隨機數(shù)種子為1。
? ? ? ? ? ? ? ? rand()產(chǎn)生的是偽隨機數(shù)字,每次執(zhí)行時是相同的;若要不同,用函數(shù)srand()初始化它。
?
#include <iostream>
using namespace std;
#include <stdlib.h>
#include <time.h>
#define MIN 1 //隨機數(shù)產(chǎn)生的范圍
#define MAX 10int main()
{ int i; srand((unsigned)time(0));cout<<"Ten random numbers from "<<MIN<<" to "<<MAX<<" :/n"<<endl; for(i=0; i<10; i++) //產(chǎn)生隨機數(shù){cout<<MIN + (int)MAX * rand() / (RAND_MAX + 1)<<"/t"; }cout<<endl;return 0;
}
二、srand()
? 函數(shù)名: ? srand ??
? 功 ? 能: ? 初始化隨機數(shù)發(fā)生器 ??
? 用 ? 法: ? void srand(unsigned ?int ?seed); ?
? 所在頭文件: stdlib.h ?
? 函數(shù)說明:
? ? ? ? ? ? ? ?srand()用來設(shè)置rand()產(chǎn)生隨機數(shù)時的隨機數(shù)種子。
? ? ? ? ? ? ? ?參數(shù)seed必須是個整數(shù),通常可以利用time(0)的返回值或NULL來當(dāng)做seed。
? ? ? ? ? ? ? ?如果每次seed都設(shè)相同值,rand()所產(chǎn)生的隨機數(shù)值每次就會一樣。
?
#define MAX 99int main()
{ int i; srand((unsigned)time(NULL));cout<<"Ten random numbers from "<<MIN<<" to "<<MAX<<" :/n"<<endl; for(i=0; i<10; i++) //產(chǎn)生隨機數(shù){cout<<MIN + rand() % (MAX + MIN - 1)<<"/t"; }cout<<endl;return 0;
}
三、rand()和srand()的關(guān)系
? ? ? rand()和srand()要一起使用,其中srand()用來初始化隨機數(shù)種子,rand()用來產(chǎn)生隨機數(shù)。
? ? ? 因為默認(rèn)情況下隨機數(shù)種子為1,而相同的隨機數(shù)種子產(chǎn)生的隨機數(shù)是一樣的,失去了隨機性的意義,所以為使每次得到的隨機數(shù)不一樣,用函數(shù)srand()初始化隨機數(shù)種子。srand()的參數(shù),用time函數(shù)值(即當(dāng)前時間),因為兩次調(diào)用rand()函數(shù)的時間通常是不同的,這樣就可以保證隨機性了。
四、產(chǎn)生一定范圍隨機數(shù)的通用表示公式
? ? ? 要取得[a,b)的隨機整數(shù),使用(rand() % (b-a))+ a (結(jié)果值含a不含b)。
? ? ? 要取得[a,b]的隨機整數(shù),使用(rand() % (b-a+1))+ a (結(jié)果值含a和b)。
? ? ? 要取得(a,b]的隨機整數(shù),使用(rand() % (b-a))+ a + 1 (結(jié)果值不含a含b)。
? ? ? (總的來說,通用公式:a + rand() % n ;其中的a是起始值,n是整數(shù)的范圍)
? ? ? 要取得a到b之間的隨機整數(shù),另一種表示:a + (int)b * rand() / (RAND_MAX + 1)。
? ? ? 要取得0~1之間的浮點數(shù),可以使用rand() / double(RAND_MAX)。
五、產(chǎn)生相同的隨機數(shù)的原因
? ? ? 計算機的隨機數(shù)都是由偽隨機數(shù),即是由小M多項式序列生成的,其中產(chǎn)生每個小序列都有一個初始值,即隨機種子。(注意: 小M多項式序列的周期是65535,即每次利用一個隨機種子生成的隨機數(shù)的周期是65535,當(dāng)你取得65535個隨機數(shù)后它們又重復(fù)出現(xiàn)了。) ?
? ? ? 我們知道rand()函數(shù)可以用來產(chǎn)生隨機數(shù),但是這不是真真意義上的隨機數(shù),是一個偽隨機數(shù),是根據(jù)一個數(shù)(我們可以稱它為種子)為基準(zhǔn)以某個遞推公式推算出來的一系列數(shù),當(dāng)這系列數(shù)很大的時候,就符合正態(tài)公布,從而相當(dāng)于產(chǎn)生了隨機數(shù),但這不是真正的隨機數(shù),當(dāng)計算機正常開機后,這個種子的值是定了的,除非你破壞了系統(tǒng)。?
?
#include <iostream>
using namespace std;
#include <stdlib.h>
#include <time.h>int main()
{int i;for (i=0; i<10; i++) //產(chǎn)生10個隨機數(shù){cout<<rand()<<"/t";}cout<<endl;return 0;
}
每次運行得到相同的隨機序列:37 21367 6474? 26500 13169 34524 22678
為得到不同的隨機數(shù)序列,則需改變這個種子的值。方法:在開始產(chǎn)生隨機數(shù)前,調(diào)用一次srand(time(NULL))(注意:srand()一定要放在循環(huán)外面或者是循環(huán)調(diào)用的外面,否則的話得到的是相同的隨機數(shù))。
#include <iostream>
using namespace std;
#include <stdlib.h>
#include <time.h>int main()
{int i;srand((unsigned)time(NULL)); //初始化隨機數(shù)種子for (i=0; i<10; i++) //產(chǎn)生10個隨機數(shù){cout<<rand()<<"/t";}cout<<endl;return 0;
}
每次運行得到不同的隨機序列:
? ? ? ? ? ? ? ? ? ? ? ? ? 2372 18732 13211 1543 11560 27084 19670 15425 231 20965
? ? ? ? ? ? ? ? ? ? ? ? ? 2174 23514 18726 13458 21435 12659 9118 8334 2133 2353
?
總結(jié)
以上是生活随笔為你收集整理的C++:rand()函数和srand()函数解读的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RANSAC算法(2):(拟合平面)本文
- 下一篇: C++:vector中使用.clear(