日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
生成隨機(jī)數(shù)的方式你選對了嗎?

生成隨機(jī)數(shù)的N種方式

只為您設(shè)計更接底氣、較有營銷力的好網(wǎng)站,將營銷策劃與網(wǎng)頁設(shè)計互相結(jié)合的專業(yè)機(jī)構(gòu),營銷型網(wǎng)站公司中較早掌握H5頁面制作技術(shù)的機(jī)構(gòu)。一個好的成都品牌網(wǎng)站建設(shè),不能只是一張名片,茫茫網(wǎng)海,想要快速吸引到您客戶的眼球,必須全方位的展現(xiàn)出企業(yè)突出的優(yōu)勢,以求達(dá)到主動營銷的效果,最終促成成交!

首先需要說明的是,計算機(jī)中生成的隨機(jī)數(shù)嚴(yán)格來說都是偽隨機(jī),即非真正的隨機(jī)數(shù),真正隨機(jī)數(shù)的隨機(jī)樣本不可重現(xiàn)。那么我們來看看代碼中有哪些方式可以生成隨機(jī)數(shù)。

rand

rand函數(shù)聲明如下:

 
 
 
  1. #include 
  2. int rand(void);

rand函數(shù)返回[0,RAND_MAX)范圍的隨機(jī)整數(shù),在我的機(jī)器上,RAND_MAX為2147483647。

使用示例:

 
 
 
  1. rand.c
  2. */
  3. #include
  4. #include
  5. int main(void)
  6. {
  7.     int i = 0;
  8.     while(i < 5)
  9.     {
  10.         printf("%d ",rand());
  11.         i++;
  12.      }
  13.     printf("\n");
  14.     return 0;
  15. }

編譯運行:

 
 
 
  1. $ gcc -o rand rand.c
  2. ./rand
  3. 1804289383 846930886 1681692777 1714636915 1957747793

多運行幾次,你就會驚喜地發(fā)現(xiàn),每次運行的結(jié)果都是一樣的!!!這還玩?zhèn)€毛線?

srand

別急,rand雖然每次運行的結(jié)果都是一樣的,那是因為它的種子默認(rèn)為1。每一個種子會有一串看似隨機(jī)的序列,每次取下一個出來,整體都近乎是隨機(jī)分布的。但是如果你的種子每次都是一樣的,那么每次運行可能得到的結(jié)果也是一樣的。我們需要利用srand給它一個種子。

 
 
 
  1. #include 
  2. void srand(unsigned int seed);

為了保證我們每次的得到的隨機(jī)數(shù)不一樣,我們必須在每次調(diào)用時,都確保種子不一樣,因此通常會選擇使用時間作為種子,注意這只是通常的種子選擇,你可以根據(jù)實際使用需求進(jìn)行選擇。

于是我們在使用之前設(shè)置好種子,使用示例:

 
 
 
  1. rand.c
  2. */
  3. #include
  4. #include
  5. #include
  6. int main(void)
  7. {
  8.     srand(time(NULL));//設(shè)置隨機(jī)種子,注意只需要設(shè)置一次即可
  9.     int i = 0;
  10.     while(i < 5)//生成5個隨機(jī)數(shù)
  11.     {
  12.         printf("%d ",rand());
  13.         i++;
  14.      }
  15.     printf("\n");
  16.     return 0;
  17. }

現(xiàn)在好了,每次運行生成的都不一樣了。但是還有一個問題,如果這種方式在多線程下使用,也是不可取的,因為rand不是可重入函數(shù)。它的每次調(diào)用都會修改一些隱藏的屬性,因此在多線程中使用它并不合適。

rand_r

為了在多線程下使用,我們使用rand_r,使用方式和rand是一樣的:

 
 
 
  1. #include 
  2. int rand_r(unsigned int *seedp);

使用示例:

 
 
 
  1. #include
  2. #include
  3. #include
  4. int main(void)
  5. {
  6.     unsigned int seed = time(NULL);
  7.     int i = 0;
  8.     while(i < 5)//生成5個隨機(jī)數(shù)
  9.     {
  10.         printf("%d ",rand_r(&seed));
  11.         i++;
  12.     }
  13.     printf("\n");
  14.     return 0;
  15. }

多線程中,多個線程可能幾乎同時調(diào)用,那它們的種子可能也一樣,如果想不一樣,還可以將種子設(shè)置成和線程id有關(guān)。

 
 
 
  1. unsigned int seed  = time(NULL)^pthread_self(); 

random

通過前面的例子可以發(fā)現(xiàn),rand生成的整數(shù)范圍是有限的,為了生成更大范圍,可以使用random:

 
 
 
  1. #include 
  2. long int random(void);
  3. void srandom(unsigned int seed);

random返回的類型為long int,因此在一定程度上,它生成的范圍要大得多。另外與rand類似,需要使用srandom函數(shù)設(shè)置種子。具體的例子就不再放出了。

生成指定范圍隨機(jī)數(shù)

前面的例子都是生成[1,RAND_MAX]之間的數(shù),如果要生成指定區(qū)間的隨機(jī)數(shù)呢?假設(shè)a和b不超過int范圍以及它們的差值不超過rand的生成范圍。

[a,b)

左閉右開區(qū)間,即包含a,不包含:

 
 
 
  1. (rand() % (b - a)) + a;

[a,b]

左閉右閉,即包含a和b:

 
 
 
  1. (rand() % (b - a + 1)) + a;

(a,b]

左開右閉,即不包含a,包含b:

 
 
 
  1. (rand() % (b-a)) + a + 1;

[0,b]

 
 
 
  1. rand() % b ;

0到1之間的浮點數(shù)

 
 
 
  1. rand()/(double)RAND_MAX;

舉例

生成[2,10)之間的隨機(jī)數(shù)5個:

 
 
 
  1. #include
  2. #include
  3. #include
  4. int main(void)
  5. {
  6.     srand(time(NULL));//設(shè)置隨機(jī)種子,注意只需要設(shè)置一次即可
  7.     int i = 0;
  8.     int a = 2;
  9.     int b = 10;
  10.     while(i < 5)//生成5個隨機(jī)數(shù)
  11.     {
  12.         printf("%d ",( rand() % ( b - a ) )+ a);
  13.         i++;
  14.      }
  15.     printf("\n");
  16.     return 0;
  17. }

總結(jié)

記住,通過這些方法生成的都是偽隨機(jī)數(shù)。而一個好的隨機(jī)算法,它的隨機(jī)性很強(qiáng),可能需要根據(jù)使用場景去設(shè)計具體的算法。本文所介紹的僅僅是庫函數(shù)提供的隨機(jī)數(shù)生成函數(shù)。


當(dāng)前標(biāo)題:生成隨機(jī)數(shù)的方式你選對了嗎?
文章起源:http://www.dlmjj.cn/article/dhsphpc.html