亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

詳解C語言的隨機數生成及其相關題目

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

產生隨機數的基本方法

本文中,筆者將介紹c語言所提供的隨機數發生器的用法。現在的c編譯程序都提供了一個基于一種ANSI標準的偽隨機數發生器函數,用來生成隨機數。Microsoft和Borland都是通過rand()和srand()函數來支持這種標準的,它們的工作過程如下:
首先,給srand()提供一個“種子”,它是一個unsignde int類型,其取值范圍是從0到65,535 ;
然后,調用rand(),它會根據提供給srand()的“種子”值返回一個隨機數(在0到32,767之間);
根據需要多次調用rand(),從而不斷地得到新的隨機數;
無論什么時候,你都可以給srand()提供一個新的“種子”,從而進一步“隨機化"rand()的輸出結果。

這個過程看起來很簡單,問題是如果你每次調用srand()時都提供相同的“種子”值,那么你將會得到相同的“隨機”數序列。例如,在以17為“種子”值調用srand()之后,在你首次調用rand()時,你將得到隨機數94;在你第二次和第三次調用rand()時,你將分別得到26,602和30,017。這些數看上去是相當隨機的(盡管這只是一個很小的數據點集合),但是,在你再次以17為“種子”值調用srand()之后,在對rand()的前三次調用中,所得到的返回值仍然是94、26,602和30,017,并且此后得到的返回值仍然是在對rand()的第一批調用中所得到的其余的返回值。因此,只有再次給srand()提供一個隨機的“種子”值,才能再次得到一個隨機數。

下面的例子用一種簡單而有效的辦法來產生一個相當隨機的“種子”值――當天的時間值。

# include <stdlib. h># include <stdio. h># include <sys/types. h># include <sys/timeb. h>void main (void){  int i ;  unsigned int seedVal;  struct_timeb timeBuf ;  _ftime (&timeBuf) ;  seedVal = ( ( ( ( (unsigned int)timeBuf, time & 0xFFFF) +          (unsigned int)timeBuf, millitm) ^          (unsigned int)timeBuf, millitm) ;  srand ((unsigned int)seedVal) ;  for(i=O;i<lO;++i)    printf (" %6d/n" ,rand ( ) ) ;}

上例先是調用_ftime()來檢索當前時間,并把它的值存入結構成員timeBuf.time中,當前時間的值從1970年1月1日開始以秒計算。在調用了_ftime()之后,在結構timeBuf的成員millitm中還存入了在當前那一秒已經度過的毫秒數,但在DOS中這個數字實際上是以百分之一秒來計算的。然后,把毫秒數和秒數相加,再和毫秒數進行一次異或運算。你可以對這兩個結構成員施加更多的邏輯運算,以控制seedVal的取值范圍,并進一步加強它的隨機性,但上例所用的邏輯運算已經足夠了。

注意,在前面的例子中,rand()的輸出并沒有被限制在一個指定的范圍內,假設你想建立一個彩票選號器,其取值范圍是從1到44。你可以簡單地忽略掉rand()所輸出的在該范圍之外的值,但這將花費許多時間去得到所需的全部(例如6個)彩票號碼。假設你已經建立了一個令你滿意的隨機數發生器,它所產生的隨機數據范圍是從0到32,767(就象前文中提到過的那樣),而你想把輸出限制在1到44之間,下面的例子就說明了如何來完成這項工作:

int i ,k ,range ;int rain, max ;double j ;min=1;  /* 1 is the minimum number allowed */max=44;  /* 44 is the maximum number allowed */range=max-min;  /* r is the range allowed; 1 to 44 */i=rand();  /* use the above example in this slot *//* Normalize the rand() output (scale to 0 to 1) *//* RAND_MAX is defined in stdlib, h */j= ((double)i/(double)RAND_MAX) ;/* Scale the output to 1 to 44 */i= (int)(j * (double)range) ;i+ =min;

上例把輸出的隨機數限制在1到44之間,其工作原理如下:
得到一個在O到RAND_MAX(32,767)之間的隨機數,把它除以RAND_MAX,從而產生一個在0到1之間的校正值;
把校正值乘以所需要的范圍值(在本例中為43,即44減去1),從而產生一個在O到43之間的值;
把該值和所要求的最小值相加,從而使該值最終落在正確的取值范圍――1到44之內。

你可以用不同的min和max值來驗證這個例子,你會發現它總是會正確地產生在新的rain和max值之間的隨機數。

下面來看一下隨機數的相關練習題目

題目
給定了rand7,如何生成rand3?

思路
一個非常直觀的思路,就是不斷的調用rand7,直到它產生1-3之間的數,然后返回。代碼如下:(如果有同學說這里沒有3,但是不代表我不能判斷和3的大小比較吧)

 

  #include <stdio.h>      int rand_3()   {     int x;        while (x = rand_7()) {       if (x <= 3) {         return x;       }     }   } 


接下來,就是判斷rand_3是否能等概率的產生1,2,3.也就是我們需要計算產生1,2,3的概率是否都是1/3.

首先,rand_7可以等概率的產生1-7,我們以rand_3生成1為例,假設:

  •     第一次生成1的概率是1/7
  •     第二次生存1的概率是4/7 * 1/7,因此第一次肯定是生成了大于3的數例如4,5,6,7,概率是4/7
  •     同理,第三次生成1的概率是(4/7)^2 * 1/7

因此,rand_3生成1的概率是P(x=1)= 1/7 +  (4/7) * 1/7 + (4/7)^2 * 1/7 + ... + (4/7)^n-1 * 1/7 //等比數列
                                                  =  1/7 * ((1 - (4/7)^n) / 1 - 4/7) = 1/7 * 7/3 = 1/3

同理,可驗證生成2,3的概率均為1/3

結論
上述證明說明rand3可以等概率的產生1,2,3.從上面的分析,我們可以得出一個更一般的結論:

如果a>b,我們一定可以用rand_a去實現rand_b.其中,rand_a是等可能的生成1-a,rand_b是等可能的生成1-b

擴展

現在給定兩個生成隨機數的函數rand_a和rand_b,rand_a和rand_b分別產生1-a和1-b的隨機數,a和b不相等,現在讓你用rand_a實現rand_b,方法如下:

  •     如果a>b,則可以直接采用上述方法
  •     如果a<b, 則構造rand_a^2=a * (rand_a - 1) + rand_a,表示生成1-a^2的隨機數,如果a^2還小于b,那么繼續構造rand_a^3=a * (rand_a^2 - 1) + rand_a


舉例說明
阿里2014年筆試題目,是給定生成1-7的隨即函數rand_7,看是否能生成其它隨機數?

我們先看一下是否能等概率生成1-49,構造rand_49 = 7 * (rand_7 - 1) + rand_7 (ps:別問我7從哪里來的,rand_7既然能隨即生成1-7,我當然可以獲得到7了)

rand_7 - 1能等概率的生成0, 1, 2, 3, 4, 5, 6,每個數的生成概率都是1/7,所以*7之后,可以等概率的生成0,7,14,21,28,35,42,每個數的概率都是1/7

既然0,7,14,21,28,35,42每個數的概率都是1/7,當每個數都加上+rand_7之后,則1-49是等概率產生的,1/7 × 1/7 = 1/49,中間不會出現重復數據

所以,我們用rand_7產生了rand_49,有了rand_49,按照最初上面過濾的方法,我們當然可以獲得任何小于49的隨機函數


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

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人黄色生活片| 欧美最顶级丰满的aⅴ艳星| 国产欧洲精品视频| 精品福利免费观看| 国产精品亚洲视频在线观看| 欧美日韩国产精品专区| 久久久久久久电影一区| 欧美激情一级精品国产| 日韩电影第一页| 欧美日产国产成人免费图片| 成人97在线观看视频| 国产精品网红直播| 午夜精品一区二区三区在线视| 尤物yw午夜国产精品视频| 岛国av一区二区| 国产精品免费久久久久影院| 亚洲天堂日韩电影| 欧美性在线观看| 亚洲午夜精品视频| 91中文字幕在线观看| 色无极亚洲影院| 国产亚洲aⅴaaaaaa毛片| 色av中文字幕一区| 中文字幕在线看视频国产欧美| 国产欧美日韩中文字幕| 日本精品久久中文字幕佐佐木| 欧美亚洲日本网站| 亚洲欧洲成视频免费观看| 欧美成年人网站| 欧美xxxwww| 国产狼人综合免费视频| 亚洲国产欧美一区二区三区久久| 97福利一区二区| 成人两性免费视频| 亚洲国产成人爱av在线播放| 亚洲欧美国产日韩天堂区| 97国产在线视频| 国产精品人人做人人爽| 精品久久久久久中文字幕大豆网| 欧美激情2020午夜免费观看| 伊人激情综合网| 久久久免费观看视频| 亚洲视频在线观看视频| 国产成人精品国内自产拍免费看| 久久亚洲国产精品成人av秋霞| 亚洲美腿欧美激情另类| 精品国产鲁一鲁一区二区张丽| 国产精品成人久久久久| 69久久夜色精品国产7777| 亚洲一区二区在线播放| 国产成人精品av| 国产精品日本精品| 欧美日韩精品国产| 欧美精品做受xxx性少妇| 欧美在线观看网址综合| 中文字幕久热精品视频在线| 91欧美精品午夜性色福利在线| 成人免费网站在线观看| 久久亚洲精品国产亚洲老地址| 91国产高清在线| 91高清在线免费观看| 日韩精品中文字幕视频在线| 亚洲无亚洲人成网站77777| 精品久久久中文| 国产精品18久久久久久首页狼| 一区二区日韩精品| 久久久久久久999| 成人黄色在线播放| 日韩在线观看精品| 日韩免费在线播放| 色综合亚洲精品激情狠狠| 亚洲品质视频自拍网| 国产美女搞久久| 成人午夜激情免费视频| 欧美精品久久久久| 欧美精品在线视频观看| 91精品视频网站| 国产亚洲精品一区二区| 欧美精品在线看| 亚洲国产精品高清久久久| 精品国产91乱高清在线观看| 欧美一乱一性一交一视频| 日韩精品在线免费| 亚洲二区在线播放视频| 国内精品久久久久影院 日本资源| 国产亚洲精品一区二555| 国产在线观看不卡| 日韩中文字幕第一页| 色哟哟网站入口亚洲精品| 久久久久久噜噜噜久久久精品| 国产一区二区三区精品久久久| 久久影院资源网| 91网站在线看| 久久av红桃一区二区小说| 最近免费中文字幕视频2019| 黄色一区二区在线| 成人字幕网zmw| 精品国偷自产在线视频| 国产精品久久97| 欧美裸体xxxx极品少妇软件| 精品免费在线视频| 亚洲人成人99网站| 亚洲高清久久久久久| 亚洲精品国精品久久99热一| 亚洲一区久久久| 日韩在线观看免费高清完整版| 97视频在线观看视频免费视频| 精品国产欧美一区二区三区成人| 综合网日日天干夜夜久久| 亚洲视频在线观看免费| 亚洲第一av网| 黑丝美女久久久| 亚洲欧美一区二区精品久久久| 亚洲视频视频在线| 国产亚洲人成网站在线观看| 日韩精品高清在线观看| 久久久久久久久电影| 久久久久久久久国产| 日韩电影免费观看在线| 亚洲第一精品久久忘忧草社区| 国产午夜精品全部视频在线播放| 免费91麻豆精品国产自产在线观看| 国产精品99久久久久久久久久久久| 欧美国产日韩二区| 国产丝袜视频一区| 欧美在线激情视频| 亚洲视频在线免费观看| 亚洲无限乱码一二三四麻| 国产精品xxxxx| 午夜精品福利视频| 国产精品福利在线| 欧美国产日本在线| 8x拔播拔播x8国产精品| 亚洲国产精品电影在线观看| 羞羞色国产精品| 97超碰蝌蚪网人人做人人爽| 欧美富婆性猛交| 欧美激情2020午夜免费观看| 欧美日韩国产一中文字不卡| 欧美激情亚洲一区| 欲色天天网综合久久| 国产91精品不卡视频| 欧美高清在线观看| 国产精品最新在线观看| 亚洲第一级黄色片| 91免费在线视频网站| 欧美国产第一页| 这里只有精品丝袜| 日韩在线观看电影| 青青久久av北条麻妃海外网| 在线日韩欧美视频| 91九色国产视频| 色综合久久中文字幕综合网小说| 日韩在线观看成人| 成人a在线视频| 国产精品久久久久7777婷婷| 亚洲国产精品久久久久秋霞不卡| 日韩av免费在线播放| 色综合视频网站| 2021久久精品国产99国产精品| 欧美噜噜久久久xxx| 亚洲欧美日韩视频一区| 亚洲毛片在线免费观看| 国产精品中文久久久久久久|