C說話編程中生成隨機數的入門教程。本站提示廣大學習愛好者:(C說話編程中生成隨機數的入門教程)文章只能為提供參考,不一定能成為您想要的結果。以下是C說話編程中生成隨機數的入門教程正文
說話發生隨機數是一個罕見的編程功效義務,固然這個也不難,挪用兩三個函數就出來了,然則你曉得這些函數詳細是起到如何的感化,而且是它們是若何發生隨機數的嗎?
幾個概念
隨機數:數學上發生的都是偽隨機數,真實的隨機數應用物理辦法發生的。
隨機數種子:隨機數的發生是由算術規矩發生的,srand(seed)的隨機數種子分歧,rand()的隨機數值就分歧,倘使每次的隨機數種子一樣,則rand()的值就一樣。所以要發生隨機數,則srand(seed)的隨機數種子必需也要隨機的。
用srand()發生隨機數種子
原型:void srand ( unsigned int seed );
感化是設置好隨機數種子,為了讓隨機數種子是隨機的,平日用time(NULL)的值來當seed。
time()用於隨機數種子
函數原型:time_t time ( time_t * timer );
time()函數表現前往1970-1-1 00:00:00 到以後時光的秒數。
用的時刻如許:srand(unsigned(time(NULL)));例如發生1~10之間的隨機整數
#include <stdlib.h> #include <time.h> int main() { srand(time(NULL)); for(int i=0;i < 10;i++) { int randValue=rand()%10; } }
下面的法式中要留意srand是在for輪回裡面的,假如把srand放到for輪回外面,則每次發生的隨機數都雷同。
用rand()發生隨機數
原型:int rand ( void );
感化是發生一個隨機數,固然隨機數是有規模的,為0~RAND_MAX之間,隨機數與隨機數種子有關。詳細來講是,在發生隨機數 rand()被挪用的時刻,它會如許履行:
假如用戶之前挪用過 srand(seed)的話,他會從新挪用一遍 srand(seed)以發生隨機數種子;
假如發明沒有挪用過 srand(seed)的話,會主動挪用 srand(1)一次。
假如挪用srand(seed)發生的隨機數種子是一樣的話(即seed的值雷同),rand()發生的隨機數也雷同。
所以,假如願望rand()每次挪用發生的值都紛歧樣,就須要每次挪用srand(seed)一次,並且seed不克不及雷同。這裡就是常常采取time(NULL)發生隨機數種子的緣由。
C說話中可使用rand()函數來生成一個從0到RAND_MAX的uniform散布。基於這個函數,我們可以結構出一些特定的隨機數生成器來知足我們的需求。
(一)0到1的uniform散布:
//generate a random number in the range of [0,1] double uniform_zero_to_one(){ return (double)rand()/RAND_MAX; }
(二)隨意率性實數區間的uniform散布:
//generate a random real number in [start,end] double uniform_real(double start,double end){ double rate=(double)rand()/RAND_MAX; return start+(end-start)*rate; }
(三)隨意率性整數區間的uniform散布:
//generate a random integer number in [start,end) int uniform_integer(int start,int end){ int base=rand(); if(base==RAND_MAX) return uniform_integer(start,end); int range=end-start; int remainder=RAND_MAX%range; int bucket=RAND_MAX/range; if(base<RAND_MAX-remainder) return start+base/bucket; else return uniform_integer(start,end); }
這個函數要特殊解釋一下,平凡時刻我們都是用rand()%n來生成0到n-1的隨機數,然則按這類辦法生成的散布其實不是uniform的,別的因為RAND_MAX只要32767,是以要生成比這個數更年夜的隨機數須要別的想方法,實際上可以直接用0到1的uniform散布直接放縮,但現實後果欠好。這裡給出一種移位方法的完成。
(四)32bits的隨機數
//generate a random 32 bits integer number int rand32(){ return ((rand()<<16)+(rand()<<1)+rand()%2); }
有了32bits的隨機數生成辦法,便可以結構32bits規模內的隨機整數區間了,辦法和之前16bits的情形一樣。
(五)32bits規模內的隨機整數區間
//generate a random 32bits integer number in [start,end) int uniform_integer_32(int start,int end){ int base=rand32(); if(base==RAND32_MAX) return uniform_integer_32(start,end); int range=end-start; int remainder=RAND32_MAX%range; int bucket=RAND32_MAX/range; if(base<RAND32_MAX-remainder) return start+base/bucket; else return uniform_integer_32(start,end); }
這裡RAND32_MAX界說為0x7fffffff。
除此以外,應用rand()函數結構隨意率性散布的隨機數也是個值得商量的成績。
實際上可以經由過程(0,1)的uniform散布,加上尺度采樣辦法(sampling)取得。