国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C > 正文

C語言編程中生成隨機數的入門教程

2020-01-26 14:48:45
字體:
來源:轉載
供稿:網友

語言產生隨機數是一個常見的編程功能任務,當然這個也不難,調用兩三個函數就出來了,但是你知道這些函數具體是起到怎樣的作用,并且是它們是如何產生隨機數的嗎?

幾個概念

隨機數:數學上產生的都是偽隨機數,真正的隨機數使用物理方法產生的。

隨機數種子:隨機數的產生是由算術規(guī)則產生的,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循環(huán)外面的,如果把srand放到for循環(huán)里面,則每次產生的隨機數都相同。

用rand()產生隨機數

原型:int rand ( void );

作用是產生一個隨機數,當然隨機數是有范圍的,為0~RAND_MAX之間,隨機數與隨機數種子有關。具體來說是,在產生隨機數 rand()被調用的時候,它會這樣執(zhí)行:

如果用戶之前調用過 srand(seed)的話,他會重新調用一遍 srand(seed)以產生隨機數種子;
如果發(fā)現沒有調用過 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;}

(二)任意實數區(qū)間的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;}

(三)任意整數區(qū)間的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范圍內的隨機整數區(qū)間了,方法和之前16bits的情況一樣。

(五)32bits范圍內的隨機整數區(qū)間

//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)獲得。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 镇沅| 龙井市| 怀远县| 五常市| 宜阳县| 开阳县| 洛宁县| 博罗县| 乌拉特中旗| 高淳县| 合山市| 青河县| 军事| 桦甸市| 永康市| 凤阳县| 江西省| 平顶山市| 保靖县| 临海市| 年辖:市辖区| 藁城市| 贵南县| 大足县| 土默特右旗| 新竹县| 台北市| 南丰县| 浑源县| 吉首市| 湘乡市| 长宁县| 商洛市| 南岸区| 彭泽县| 台北县| 兴和县| 侯马市| 岳池县| 南郑县| 辽阳市|