C語言rand函數(shù)的應(yīng)用實(shí)例(隨機(jī)數(shù)的生成)
一、rand函數(shù)
1.簡(jiǎn)介
用于生成隨機(jī)數(shù)的函數(shù)
使?需要包含?個(gè)頭?件:<stdlib.h>
2.返回值
返回一個(gè)介于和之間的偽隨機(jī)整數(shù)。
一個(gè)介于0和RAND_MAX之間的整數(shù)值。
(RAND_MAX為32767)
那為什么說是偽隨機(jī)數(shù)呢?
如下代碼:
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
return 0;
}
運(yùn)行結(jié)果:

大家可以自行嘗試下,代碼兩次運(yùn)行結(jié)果一模一樣
這也說明了rand生成的數(shù)是偽隨機(jī)數(shù)
那該如何生成真正的隨機(jī)數(shù)呢?
rand函數(shù)是對(duì)?個(gè)叫種?的基準(zhǔn)值進(jìn)?運(yùn)算?成的隨機(jī)數(shù)。之所以前?每次運(yùn)?程序產(chǎn)?的隨機(jī)數(shù)序列是?樣的,是因?yàn)閞and函數(shù)?成隨機(jī)數(shù)的默認(rèn)種?是1。而要想得到真正的隨機(jī)數(shù)就要使種子不斷變化。這就可以用到srand函數(shù)。
二、srand函數(shù)
函數(shù)原型:
void srand(unsigned int seed);
srand函數(shù)的使?需要包含?個(gè)頭?件:<stdlib.h>
調(diào)?rand函數(shù)之前先調(diào)?srand函數(shù),
通過srand函數(shù)的參數(shù)seed來設(shè)置rand函數(shù)所需要不斷變化的種子,
使得rand函數(shù)生成的是真正的隨機(jī)數(shù)。
如下代碼:
#include <stdio.h>
#include <stdlib.h>
int main()
{
srand(1);
//修改種子
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
return 0;
}種子不同時(shí)運(yùn)行結(jié)果:


可以看見兩次結(jié)果不同,可以見得:
種子不一樣時(shí),生成的隨機(jī)數(shù)也不同
但是,?成隨機(jī)數(shù)的時(shí)候又需要另?個(gè)隨機(jī)數(shù),這就矛盾了。
三、time函數(shù)
1.簡(jiǎn)介
函數(shù)說明:
time函數(shù)可以獲取當(dāng)前的系統(tǒng)時(shí)間,返回的是一個(gè)time_t類型的從1970年1?1?0時(shí)0分0秒到現(xiàn)在程序運(yùn)?時(shí)間之間的差值,如果我們給time函數(shù)傳一個(gè)空指針(NULL),就會(huì)只返回這個(gè)時(shí)間的差值,這個(gè)差值也被稱為時(shí)間戳。
返回值:
成功則返回秒數(shù),失敗則返回((time_t)-1)值,錯(cuò)誤原因存于error中。
頭文件:
time函數(shù)在使用前需要包含頭文件< time.h >
2.注意
由上文可知:
由于srand函數(shù)的參數(shù)是需要一個(gè)unsigned int 類型的值,雖然time函數(shù)的返回值為time_t類型的,但是時(shí)間戳是一個(gè)正數(shù);所以我們只要把time函數(shù)的返回值強(qiáng)制類型轉(zhuǎn)換為unsigned int類型即可。
3.演示
演示:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
srand((unsigned int)(time(NULL)));
//真正的隨機(jī)數(shù)
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
return 0;
}大家也可以自行去試一試,每次運(yùn)行的結(jié)果都不相同
兩次運(yùn)行結(jié)果:


四、隨機(jī)數(shù)的生成
現(xiàn)在,我們可以生成出一個(gè)介于0和RAND_MAX之間的整數(shù)值
(RAND_MAX為32767)
但是要想生成 0到100 或 100到200 等自定義隨機(jī)數(shù)要怎么辦呢?
這里需要用到一個(gè)運(yùn)算符(%),這個(gè)運(yùn)算符是取模運(yùn)算符,得到的就是除以一個(gè)數(shù)的余數(shù)。我們只需要將得到的隨機(jī)數(shù)除上規(guī)定的范圍那個(gè)數(shù)就可以得到需要范圍的數(shù)。
例如:
要生成 0到99 隨機(jī)數(shù):
就寫rand ()%100;要生成 1到100 隨機(jī)數(shù):
就寫rand ()%100+1;要生成 100到200 隨機(jī)數(shù):
就寫rand ()%101+100;
萬能公式:
生成 a 到 b 隨機(jī)數(shù):
a + rand( ) % ( b - a + 1 );
演示:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
srand((unsigned int)(time(NULL)));
//真正的隨機(jī)數(shù)
printf("%d\n", rand() % 100);
//0-99
printf("%d\n", rand() % 100 + 1);
//1-100
printf("%d\n", rand() % 101 + 100);
//100-200
return 0;
}運(yùn)行結(jié)果:

五、應(yīng)用
學(xué)會(huì)了隨機(jī)數(shù)的生成,我們可以應(yīng)用到隨機(jī)數(shù)完成一些游戲
掃雷中布置雷是隨機(jī)的,故可以用到rand函數(shù)以及本文的內(nèi)容
我們就可以完成一個(gè)掃雷游戲
下一期我們?cè)斀鈷呃祝。。?/p>
六、結(jié)語
本期資料來自于:

到此這篇關(guān)于C語言rand函數(shù)應(yīng)用(隨機(jī)數(shù)的生成)的文章就介紹到這了,更多相關(guān)C語言rand函數(shù)應(yīng)用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vs2019+Qt+Opencv環(huán)境配置心得(圖文)
這篇文章主要介紹了Vs2019+Qt+Opencv環(huán)境配置心得(圖文),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
c++?error:crosses?initialization?of問題解決分析
這篇文章主要介紹了c++?error:crosses?initialization?ofde?問題解決分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08
C++ string類getline()用法實(shí)例詳解
C++ getline()是一種標(biāo)準(zhǔn)庫函數(shù),用于從輸入流中讀取字符串或行,它是<string>標(biāo)頭的一部分,本文介紹C++ string類getline()用法詳解,感興趣的朋友一起看看吧2024-03-03
C++設(shè)計(jì)模式之享元模式(Flyweight)
這篇文章主要為大家詳細(xì)介紹了C++設(shè)計(jì)模式之享元模式Flyweight,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04
C++類的構(gòu)造與析構(gòu)特點(diǎn)及作用詳解
本文章將會(huì)可能會(huì)涉及到匯編的知識(shí),不過沒有關(guān)系,我會(huì)講的盡量通俗易懂;另外本篇文章開始前,建議了解下什么是函數(shù)重載,這個(gè)概念很簡(jiǎn)單的--有相同的函數(shù)名,但參數(shù)列表不相同的函數(shù),就是函數(shù)重載2022-10-10

