小編給大家分享一下c語(yǔ)言中如何生成隨機(jī)數(shù),相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
在香河等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專(zhuān)注、極致的服務(wù)理念,為客戶(hù)提供成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作 網(wǎng)站設(shè)計(jì)制作按需制作,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),高端網(wǎng)站設(shè)計(jì),成都營(yíng)銷(xiāo)網(wǎng)站建設(shè),外貿(mào)網(wǎng)站制作,香河網(wǎng)站建設(shè)費(fèi)用合理。
生成隨機(jī)數(shù)的N種方式
首先需要說(shuō)明的是,計(jì)算機(jī)中生成的隨機(jī)數(shù)嚴(yán)格來(lái)說(shuō)都是偽隨機(jī),即非真正的隨機(jī)數(shù),真正隨機(jī)數(shù)的隨機(jī)樣本不可重現(xiàn)。那么我們來(lái)看看代碼中有哪些方式可以生成隨機(jī)數(shù)。
rand
rand函數(shù)聲明如下:
#includeint rand(void);
rand函數(shù)返回[0,RAND_MAX)范圍的隨機(jī)整數(shù),在我的機(jī)器上,RAND_MAX為2147483647。
使用示例:
rand.c */ #include#include int main(void) { int i = 0; while(i < 5) { printf("%d ",rand()); i++; } printf("\n"); return 0; }
編譯運(yùn)行:
$ gcc -o rand rand.c ./rand 1804289383 846930886 1681692777 1714636915 1957747793
多運(yùn)行幾次,你就會(huì)驚喜地發(fā)現(xiàn),每次運(yùn)行的結(jié)果都是一樣的!!!這還玩?zhèn)€毛線(xiàn)?
srand
別急,rand雖然每次運(yùn)行的結(jié)果都是一樣的,那是因?yàn)樗姆N子默認(rèn)為1。每一個(gè)種子會(huì)有一串看似隨機(jī)的序列,每次取下一個(gè)出來(lái),整體都近乎是隨機(jī)分布的。但是如果你的種子每次都是一樣的,那么每次運(yùn)行可能得到的結(jié)果也是一樣的。我們需要利用srand給它一個(gè)種子。
#includevoid srand(unsigned int seed);
為了保證我們每次的得到的隨機(jī)數(shù)不一樣,我們必須在每次調(diào)用時(shí),都確保種子不一樣,因此通常會(huì)選擇使用時(shí)間作為種子,注意這只是通常的種子選擇,你可以根據(jù)實(shí)際使用需求進(jìn)行選擇。
于是我們?cè)谑褂弥霸O(shè)置好種子,使用示例:
rand.c */ #include#include #include int main(void) { srand(time(NULL));//設(shè)置隨機(jī)種子,注意只需要設(shè)置一次即可 int i = 0; while(i < 5)//生成5個(gè)隨機(jī)數(shù) { printf("%d ",rand()); i++; } printf("\n"); return 0; }
現(xiàn)在好了,每次運(yùn)行生成的都不一樣了。但是還有一個(gè)問(wèn)題,如果這種方式在多線(xiàn)程下使用,也是不可取的,因?yàn)閞and不是可重入函數(shù)。它的每次調(diào)用都會(huì)修改一些隱藏的屬性,因此在多線(xiàn)程中使用它并不合適。
rand_r
為了在多線(xiàn)程下使用,我們使用rand_r,使用方式和rand是一樣的:
#includeint rand_r(unsigned int *seedp);
使用示例:
#include#include #include int main(void) { unsigned int seed = time(NULL); int i = 0; while(i < 5)//生成5個(gè)隨機(jī)數(shù) { printf("%d ",rand_r(&seed)); i++; } printf("\n"); return 0; }
多線(xiàn)程中,多個(gè)線(xiàn)程可能幾乎同時(shí)調(diào)用,那它們的種子可能也一樣,如果想不一樣,還可以將種子設(shè)置成和線(xiàn)程id有關(guān)。
unsigned int seed = time(NULL)^pthread_self();
random
通過(guò)前面的例子可以發(fā)現(xiàn),rand生成的整數(shù)范圍是有限的,為了生成更大范圍,可以使用random:
#includelong int random(void); void srandom(unsigned int seed);
random返回的類(lèi)型為long int,因此在一定程度上,它生成的范圍要大得多。另外與rand類(lèi)似,需要使用srandom函數(shù)設(shè)置種子。具體的例子就不再放出了。
生成指定范圍隨機(jī)數(shù)
前面的例子都是生成[1,RAND_MAX]之間的數(shù),如果要生成指定區(qū)間的隨機(jī)數(shù)呢?假設(shè)a和b不超過(guò)int范圍以及它們的差值不超過(guò)rand的生成范圍。
[a,b)
左閉右開(kāi)區(qū)間,即包含a,不包含:
(rand() % (b - a)) + a;
[a,b]
左閉右閉,即包含a和b:
(rand() % (b - a + 1)) + a;
(a,b]
左開(kāi)右閉,即不包含a,包含b:
(rand() % (b-a)) + a + 1;
[0,b]
rand() % b ;
0到1之間的浮點(diǎn)數(shù)
rand()/(double)RAND_MAX;
舉例
生成[2,10)之間的隨機(jī)數(shù)5個(gè):
#include#include #include int main(void) { srand(time(NULL));//設(shè)置隨機(jī)種子,注意只需要設(shè)置一次即可 int i = 0; int a = 2; int b = 10; while(i < 5)//生成5個(gè)隨機(jī)數(shù) { printf("%d ",( rand() % ( b - a ) )+ a); i++; } printf("\n"); return 0; }
以上是“c語(yǔ)言中如何生成隨機(jī)數(shù)”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!