標籤:含義 cimage 輸出 dom 時鐘 遞推公式 img 調用 檔案
參考原文地址:https://www.cnblogs.com/afarmer/archive/2011/05/01/2033715.html
電腦的隨機數都是由偽隨機數,即是由小M多項式序列產生的,其中產生的每個小序列都有一個初始值,即隨機種子(即根據某一個初始值代入某個公式產生一系列值),注意:小M多項式序列的周期是65535,即每次利用一個隨機種子產生的隨機數的周期是65535,當你取得65535個隨機數後,它們又會重複出現。
我們知道rand()函數可以用來產生隨機數,但這不是真正意義上的隨機數,而是一個偽隨機數,是根據一個數(我們稱之為種子)為基準以某個遞推公式算出來的一系列數,當這系列數很大時,就符合常態分佈,從而相當於產生了隨機數,但這不是真正意義上的數,當電腦正常開機後,這個種子的值是定了的,所以隨機數也是定了的,除非你破壞了系統。
- rand()
功能:隨機數產生器; 用法:int rand(void); 標頭檔:stdlib.h
rand()的內部實現是用線性同餘法,它不是真的隨機數,因其周期特別長,故在一定範圍內可以看成是隨機的。
rand()返回一隨機數值的範圍在0~RAND_MAX之間。RAND_MAX的範圍最少是在32676之間(int),unsigned int則為65535。0~RAND_MAX中每個數字·被選中的幾率是相同的。
當使用者未設定隨機數種子時,系統預設的隨機數種子為1。因此rand()產生的是偽隨機數字,每次執行是相同的“?此處有問題,不理解(每次執行的含義是什麼)?”,通過運行程式驗證發現,每一次執行程式會產生一系列隨機數,但每一次運行產生的這一系列隨機數是相同的;若要不同,應該用srand()來初始化。
- srand()
功能:初始化隨機數發生器 用法:void srand(unsigned int seed) 標頭檔:stdlib.h
srand()用來設定rand()產生隨機數時的隨機數種子。參數seed必須是一個整數。如果每次seed都設定成相同值,rand()所產生的隨機數值每次就會一樣。若想使每次啟動並執行的參數seed不一樣,我們可以使用當前時鐘作為種子,因為每次已耗用時間肯定不一樣。
- 2.1. 使用當前時鐘作為隨機數種子
使用當前時鐘,我們可以使用標頭檔ctime或time.h裡面的time()函數
- 產生隨機數的方法
- a. 給srand()提供一個種子,它是一個unsigned int類型;
- b. 調用rand(),它會根據提供給srand()的種子值返回一個隨機數;
- c. 根據需要多次調用rand(),從而不間斷地得到新的隨機數
- d. 無論什麼時候,都可以給srand()提供一個新的種子,從而進一步“隨機化”rand()的輸出結果
- 測試代碼
#include<iostream>#include<cstdlib>#include<ctime>//#define random(a,b) (rand()%(b-a+1)+a)using namespace std;int main(){ // srand((int)time(NULL)); for(int i=0;i<10;i++) cout<<rand()<<‘ ‘; cout<<endl; // for(int i=0;i<10;i++) // cout<<random(1,100)<<‘ ‘; return 0;}
結果:沒有用srand()初始化每次運行都是下面那一系列數
srand()初始化
#include<iostream>#include<cstdlib>#include<ctime>//#define random(a,b) (rand()%(b-a+1)+a)using namespace std;int main(){ srand((int)time(NULL)); for(int i=0;i<10;i++) cout<<rand()<<‘ ‘; cout<<endl; // for(int i=0;i<10;i++) // cout<<random(1,100)<<‘ ‘; return 0;}
結果:每次運行產生的一系列數都不同
- 產生一定範圍內的隨機數
- a. [a,b): (rand()%(b-a))+a //取隨機數對(b-a)取餘(最大為b-a-1),再加上a,,即[a,b)
- b. [a,b]: (rand()%(b-a+1))+a;
- c. (a,b]: (rand()%(b-a))+a+1;
- d. (a,b): (rand()%(b-a-1))+a+1;
- d. 通用公式: a+rand()%n ,其中a是起始值,n是範圍,注意對n取餘最大值為n-1
- e. 要取得0~1之間的浮點數,可以使用rand()/(double)RAND_MAX
#include<iostream>#include<cstdlib>#include<ctime>#define random(a,b) (rand()%(b-a+1)+a)using namespace std;int main(){ srand((int)time(NULL)); for(int i=0;i<10;i++) cout<<rand()<<‘ ‘; cout<<endl; for(int i=0;i<10;i++) cout<<random(1,100)<<‘ ‘; return 0;}
結果:
以上
[轉]C++/C中產生隨機數(rand,srand用法)