91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

c語言中如何生成隨機數

發布時間:2021-12-30 16:00:23 來源:億速云 閱讀:273 作者:小新 欄目:編程語言

小編給大家分享一下c語言中如何生成隨機數,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

 

生成隨機數的N種方式

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

rand

rand函數聲明如下:

#include <stdlib.h> int rand(void);

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

使用示例:

rand.c */ #include<stdlib.h> #include<stdio.h> int main(void) {     int i = 0;     while(i < 5)     {         printf("%d ",rand());         i++;      }     printf("\n");     return 0; }

編譯運行:

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

多運行幾次,你就會驚喜地發現,每次運行的結果都是一樣的!!!這還玩個毛線?

srand

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

#include <stdlib.h> void srand(unsigned int seed);

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

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

rand.c */ #include<stdlib.h> #include<stdio.h> #include<time.h> int main(void) {     srand(time(NULL));//設置隨機種子,注意只需要設置一次即可     int i = 0;     while(i < 5)//生成5個隨機數     {         printf("%d ",rand());         i++;      }     printf("\n");     return 0; }

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

rand_r

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

#include <stdlib.h> int rand_r(unsigned int *seedp);

使用示例:

#include<stdlib.h> #include<stdio.h> #include<time.h> int main(void) {     unsigned int seed = time(NULL);     int i = 0;     while(i < 5)//生成5個隨機數     {         printf("%d ",rand_r(&seed));         i++;     }     printf("\n");     return 0; }

多線程中,多個線程可能幾乎同時調用,那它們的種子可能也一樣,如果想不一樣,還可以將種子設置成和線程id有關。

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

random

通過前面的例子可以發現,rand生成的整數范圍是有限的,為了生成更大范圍,可以使用random:

#include <stdlib.h> long int random(void); void srandom(unsigned int seed);

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

生成指定范圍隨機數

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

[a,b)

左閉右開區間,即包含a,不包含:

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

[a,b]

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

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

(a,b]

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

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

[0,b]

rand() % b ;

0到1之間的浮點數

rand()/(double)RAND_MAX;

舉例

生成[2,10)之間的隨機數5個:

#include<stdlib.h> #include<stdio.h> #include<time.h> int main(void) {     srand(time(NULL));//設置隨機種子,注意只需要設置一次即可     int i = 0;     int a = 2;     int b = 10;     while(i < 5)//生成5個隨機數     {         printf("%d ",( rand() % ( b - a ) )+ a);         i++;      }     printf("\n");     return 0; }

以上是“c語言中如何生成隨機數”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

嘉荫县| 宜良县| 保山市| 子洲县| 伽师县| 肇州县| 朔州市| 观塘区| 龙游县| 乌鲁木齐市| 五大连池市| 赞皇县| 克什克腾旗| 榆社县| 阳东县| 曲沃县| 连云港市| 耒阳市| 施甸县| 嘉峪关市| 古浪县| 西昌市| 洛宁县| 鄄城县| 奉化市| 墨江| 正阳县| 涡阳县| 桂林市| 许昌县| 秭归县| 鹤岗市| 罗源县| 金寨县| 昭通市| 镇康县| 会同县| 当雄县| 大兴区| 阿坝县| 上饶县|