a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > C > 正文

C語言中用于產(chǎn)生隨機數(shù)的函數(shù)使用方法總結(jié)

2020-01-26 14:37:16
字體:
供稿:網(wǎng)友

在UNIX操作系統(tǒng)和window的操作系統(tǒng)上,我們知道有一個函數(shù)rand,它就是用來產(chǎn)生隨機數(shù)的函數(shù)API接口,那么它的原理如何實現(xiàn)?
如果約定a1=f(seed),an+1=f(an),那么可以得到一個序列a1,a2,a3..an,那么要制作一個偽隨機函數(shù)rand,只需要讓它每調(diào)用一次就返回序列的下一個元素就行。其實就是相當于第1次調(diào)用rand返回a1,第2次返回a2,…,第n次返回an,這樣每次返回的數(shù)值都不一樣,也就是相當于隨機數(shù)了。但是其實不是真正的隨機數(shù),真正的隨機數(shù)是使用物理現(xiàn)象產(chǎn)生的:比如擲錢幣、骰子、轉(zhuǎn)輪、使用電子元件的噪音、核裂變等等。這樣的隨機數(shù)發(fā)生器叫做物理性隨機數(shù)發(fā)生器,它們的缺點是技術(shù)要求比較高。那到底什么是隨機數(shù)呢?

隨機數(shù):隨機數(shù)就是每次運行代碼的時候隨機產(chǎn)生的數(shù),每次產(chǎn)生的數(shù)的值是無法確定的,返回 0 到 RANDMAX 之間的隨機整數(shù)值,不包含 RANDMAX 的值,RANDMAX 的范圍最少是在32767之間(int),即雙字節(jié)(16位數(shù))。若用 unsigned int 雙字節(jié)是65535,四字節(jié)是4294967295的整數(shù)范圍。而且 0 到 RANDMAX 每個數(shù)字被選中的概率是相同的。

原理:產(chǎn)生隨機數(shù)的原理是根據(jù)一個值,一般稱為隨機種子,然后把這個種子作為參數(shù),經(jīng)過一系列的公式運算產(chǎn)生出一個值,這個值就是隨機數(shù)。

在 C 語言當中使用隨機數(shù)要用到 rand 函數(shù)和 srand 函數(shù),

int rand():返回值為隨機值,參數(shù)為空,通過 rand 函數(shù)就會產(chǎn)生一個隨機數(shù)。

void srand(unsigned int seed):返回值為空, 就是設(shè)置隨機種子的,當我們不設(shè)置隨機種子的時候,默認設(shè)置的種子為 1,也就是srand(1)。

使用:

#include<stdlib.h>//得引入 stdlib.h 這個頭文件int main(){ int rand_num = rand(); printf("rand_num = %d/n", rand_num); return 0;}

每次運行的結(jié)果都一樣,這是為什么呢?上面已經(jīng)說了,隨機數(shù)產(chǎn)生的是有一個隨機種子作為參數(shù),然后返回一個值,而且默認的隨機種子為1,所以每次產(chǎn)生的隨機數(shù)都一樣。

如果我們修改一下隨機種子,會發(fā)現(xiàn)隨機數(shù)和原來的不一樣了,但是每次運行的結(jié)果還是一樣:

#include<stdlib.h>//得引入 stdlib.h 這個頭文件int main(){ srand(3); int rand_num = rand(); printf("rand_num = %d/n", rand_num); srand(5); rand_num = rand(); printf("rand_num = %d/n", rand_num); return 0;}

兩次的輸出結(jié)果不一樣,我的輸出結(jié)果如下:

rand_num = 50421rand_num = 847425747

但是我們程序肯定是寫好之后,不改動隨機種子,然后每次產(chǎn)生不同的值才對啊,那我們來如何做呢?既然產(chǎn)生的隨機值與種子有關(guān),只要每次的隨機種子不一樣,那么產(chǎn)生的隨機值也不一樣,我們就可以把時間作為隨機種子,因為每次運行時,時間都不一樣,因此產(chǎn)生的隨機值也不一樣,因此我們可以這樣:

#include<time.h> //使用 time 函數(shù)必須引入 time.h 頭文件#include<stdlib.h>int main(){ srand((int)time(0)); int rand_num = rand(); printf("rand_num = %d/n", rand_num); return 0;}

這樣的話,每次輸出結(jié)果都不一樣了。

通過上面的方法,我們可以獲取不同的隨機值了,但是我們一般會獲取一定范圍內(nèi)的隨機值,比如返回 0~100 之間的返回值,比如模擬骰子,隨機返回 1~6 的值。那么我們該如何做呢?

我們要返回 0~6 的隨機值,只需在上面返回隨機值的地方對 7 取余即可:

int rand_num = rand() % 7;printf("rand_num = %d/n", rand_num);

所以我們?nèi)绻祷?0~a 的隨機值,只要對 a + 1 取余即可,所以有下面的公式:

int rand_num = rand() % (a + 1);//返回 0 ~ a 的隨機值

如果我們要返回 a ~ b 的隨機值,公式是什么呢?因為隨機數(shù)取余法只能返回 0 到某個數(shù)的隨機值,所以 a ~ b 的隨機值,我們可以先返回 0 ~ (b

主站蜘蛛池模板: 在线成人av| 久久涩 | 亚洲国产福利在线 | 国产精品久久久久久久久久东京 | 麻豆专区一区二区三区四区五区 | 国产激情视频 | 日本少妇视频 | 成人在线视频免费观看 | 欧美在线综合视频 | 国模精品视频一区二区 | 天天干天天操 | 免费中文字幕 | 成人久久| 欧美日黄 | 国产精品久久久久久福利一牛影视 | 久久精品这里热有精品 | 亚洲午夜成激人情在线影院 | 美女1区2区3区 | 激情综合色综合久久综合 | 激情欧美一区二区三区 | 一区二区三区久久 | 亚洲啪视频 | 欧美xo影院 | 国产一区影院 | 亚洲看片| 羞羞视频网站 | 国产欧美日韩在线 | 国产日韩欧美一区二区 | 国产精品久久久久久久久动漫 | 99久久精品免费看国产免费粉嫩 | 日本天天色 | 日韩有码电影 | 日韩一 | 国产欧美日韩一区二区三区 | 一级毛片免费在线 | 极品av| 久久爱www.| 国产伦精品一区二区三区四区视频 | 超碰8 | 国产精品久久久久久婷婷天堂 | 日本精品视频 |