最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2016年05月07日 15:33:55   作者:靈犀  
這篇文章主要介紹了C語(yǔ)言中用于產(chǎn)生隨機(jī)數(shù)的函數(shù)使用方法總結(jié),分別介紹了rand()函數(shù)和srand()函數(shù)以及封裝出的arc4random()函數(shù),需要的朋友可以參考下

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

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

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

在 C 語(yǔ)言當(dāng)中使用隨機(jī)數(shù)要用到 rand 函數(shù)和 srand 函數(shù),

int rand():返回值為隨機(jī)值,參數(shù)為空,通過(guò) rand 函數(shù)就會(huì)產(chǎn)生一個(gè)隨機(jī)數(shù)。

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

使用:

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

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

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

#include<stdlib.h>//得引入 stdlib.h 這個(gè)頭文件
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 = 50421

rand_num = 847425747

但是我們程序肯定是寫(xiě)好之后,不改動(dòng)隨機(jī)種子,然后每次產(chǎn)生不同的值才對(duì)啊,那我們來(lái)如何做呢?既然產(chǎn)生的隨機(jī)值與種子有關(guān),只要每次的隨機(jī)種子不一樣,那么產(chǎn)生的隨機(jī)值也不一樣,我們就可以把時(shí)間作為隨機(jī)種子,因?yàn)槊看芜\(yùn)行時(shí),時(shí)間都不一樣,因此產(chǎn)生的隨機(jī)值也不一樣,因此我們可以這樣:

#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;
}

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

通過(guò)上面的方法,我們可以獲取不同的隨機(jī)值了,但是我們一般會(huì)獲取一定范圍內(nèi)的隨機(jī)值,比如返回 0~100 之間的返回值,比如模擬骰子,隨機(jī)返回 1~6 的值。那么我們?cè)撊绾巫瞿兀?/p>

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

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

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

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

如果我們要返回 a ~ b 的隨機(jī)值,公式是什么呢?因?yàn)殡S機(jī)數(shù)取余法只能返回 0 到某個(gè)數(shù)的隨機(jī)值,所以 a ~ b 的隨機(jī)值,我們可以先返回 0 ~ (b – a)的隨機(jī)值,然后再加上 a 即可:

int rand_num = rand() % (b - a + 1);//1、返回 0 ~ (b - a)的隨機(jī)值
rand_num = rand_num + a; //2、返回 a ~ b 的隨機(jī)值

因此上面的 1 和 2 合并之后的公式為:

int rand_num = rand() % (b - a + 1) + a;//返回 a ~ b 的隨機(jī)值

大家現(xiàn)在做這樣的操作:

#include<stdlib.h>
int main()
{
 srand(2);//隨機(jī)種子固定為2
 for(int i = 0; i < 5; i++)
 {
 int rand_num = rand();
 printf("rand_num = %d\n", rand_num);//注意輸出結(jié)果  
 }
 return 0;
}

既然隨機(jī)種子一樣,為什么輸出結(jié)果不一樣呢?這里得注意一下,如果程序沒(méi)有結(jié)束,而且也沒(méi)有重新設(shè)置過(guò)隨機(jī)種子,那么系統(tǒng)會(huì)把上次的隨機(jī)值作為下次隨機(jī)函數(shù)的隨機(jī)種子,因此在上面的 for 循環(huán)當(dāng)中,其實(shí)每次的循環(huán)種子都不一樣,怎么驗(yàn)證呢?先看我這里的輸出結(jié)果為:

rand_num = 33614

rand_num = 564950498

rand_num = 1097816499

rand_num = 1969887316

rand_num = 140734213

我們可以把隨機(jī)種子設(shè)置成其中的一個(gè) rand_num 值,比如 33614,那么輸出結(jié)果如果為 564950498 的話(huà),那么說(shuō)明在 for 循環(huán)中每次都把隨機(jī)值作為下次的隨機(jī)函數(shù)的隨機(jī)種子了。

srand(33614);
int rand_num = rand();
printf("rand_num = %d\n", rand_num);

結(jié)果:

rand_num = 564950498;

驗(yàn)證完畢。

arc4random() 函數(shù):

這個(gè)函數(shù)是 C 語(yǔ)言封裝的一個(gè)比較智能的隨機(jī)函數(shù),我們只要調(diào)用這個(gè)函數(shù),就會(huì)產(chǎn)生隨機(jī)數(shù),不用設(shè)置隨機(jī)種子,而且用法很簡(jiǎn)單:

int arc_rand = arc4random();
printf("arc_rand = %d\n", arc_rand);

每次的運(yùn)行結(jié)果都不一樣。如果要產(chǎn)生 a ~ b 的隨機(jī)值,公式也是:

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

相關(guān)文章

  • 輕松實(shí)現(xiàn)C/C++各種常見(jiàn)進(jìn)制相互轉(zhuǎn)換

    輕松實(shí)現(xiàn)C/C++各種常見(jiàn)進(jìn)制相互轉(zhuǎn)換

    這篇文章主要介紹了輕松實(shí)現(xiàn)C/C++各種常見(jiàn)進(jìn)制相互轉(zhuǎn)換,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • C/C++惡意代碼盤(pán)點(diǎn)之文件自動(dòng)刪除

    C/C++惡意代碼盤(pán)點(diǎn)之文件自動(dòng)刪除

    惡意代碼的分類(lèi)包括計(jì)算機(jī)病毒、蠕蟲(chóng)、木馬等,有些技術(shù)經(jīng)常用到,有的也是必然用到。今天我們就分享一下文件自動(dòng)刪除,感興趣的可以了解一下
    2022-09-09
  • C++ 迭代器失效問(wèn)題解決

    C++ 迭代器失效問(wèn)題解決

    在C++中,當(dāng)一個(gè)vector進(jìn)行了插入或刪除操作時(shí),其迭代器可能會(huì)失效,本文就來(lái)介紹一下C++ 迭代器失效問(wèn)題解決,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • c++中將二維數(shù)組元素變換為逆向存放的實(shí)現(xiàn)代碼

    c++中將二維數(shù)組元素變換為逆向存放的實(shí)現(xiàn)代碼

    編程將一個(gè)二維數(shù)組元素變換為逆向存放,即按元素在內(nèi)存中的物理排列位置,第一個(gè)元素變成倒數(shù)第一個(gè)元素,第二個(gè)元素變成倒數(shù)第二個(gè)元素,依此類(lèi)推
    2020-11-11
  • VSstudio中scanf返回值被忽略的原因及解決方法(推薦)

    VSstudio中scanf返回值被忽略的原因及解決方法(推薦)

    這篇文章主要介紹了VSstudio中scanf返回值被忽略的原因及其解決方法,scanf返回值被忽略,接下來(lái)我就告訴大家該如何解決這個(gè)問(wèn)題,需要的朋友可以參考下
    2022-09-09
  • C++中的extern “C”用法詳解

    C++中的extern “C”用法詳解

    這篇文章主要介紹了C++中的extern “C”用法詳解,簡(jiǎn)單來(lái)說(shuō),extern “C”是C++聲明或定義C語(yǔ)言符號(hào)的方法,是為了與C兼容,需要的朋友可以參考下
    2015-03-03
  • 對(duì)稱(chēng)矩陣的壓縮儲(chǔ)存講解

    對(duì)稱(chēng)矩陣的壓縮儲(chǔ)存講解

    今天小編就為大家分享一篇關(guān)于對(duì)稱(chēng)矩陣的壓縮儲(chǔ)存講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-02-02
  • C++?異常處理機(jī)制與自定義異常體系處理方式

    C++?異常處理機(jī)制與自定義異常體系處理方式

    本節(jié)將詳細(xì)介紹C++異常處理的相關(guān)概念、用法以及如何通過(guò)自定義異常體系來(lái)滿(mǎn)足程序的需求,同時(shí),我們將對(duì)比C語(yǔ)言的傳統(tǒng)錯(cuò)誤處理方式,分析C++異常機(jī)制的優(yōu)缺點(diǎn),并探討標(biāo)準(zhǔn)庫(kù)中提供的異常體系,幫助開(kāi)發(fā)者更好地理解和使用C++的異常處理功能,感興趣的朋友一起看看吧
    2024-12-12
  • Cocos2d-x中獲取系統(tǒng)時(shí)間和隨機(jī)數(shù)實(shí)例

    Cocos2d-x中獲取系統(tǒng)時(shí)間和隨機(jī)數(shù)實(shí)例

    這篇文章主要介紹了Cocos2d-x中獲取系統(tǒng)時(shí)間和隨機(jī)數(shù)實(shí)例,本文代碼含有大量注釋來(lái)講解獲取系統(tǒng)時(shí)間和隨機(jī)數(shù)的方法,需要的朋友可以參考下
    2014-09-09
  • C++中map容器的具體使用

    C++中map容器的具體使用

    本文主要介紹了C++中map容器的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03

最新評(píng)論

雷波县| 林口县| 德庆县| 谷城县| 双城市| 施甸县| 太保市| 黄冈市| 宝鸡市| 茂名市| 将乐县| 沭阳县| 嵊州市| 临朐县| 乌拉特后旗| 安福县| 长治市| 荔波县| 浏阳市| 图木舒克市| 曲阳县| 尉犁县| 南丹县| 安化县| 军事| 方城县| 香河县| 大方县| 本溪市| 石狮市| 逊克县| 凌云县| 定西市| 诸城市| 右玉县| 东兴市| 铜梁县| 茂名市| 甘南县| 介休市| 吉木萨尔县|