C語言rand函數(shù)的應(yīng)用實例(隨機數(shù)的生成)
一、rand函數(shù)
1.簡介
用于生成隨機數(shù)的函數(shù)
使?需要包含?個頭?件:<stdlib.h>
2.返回值
返回一個介于和之間的偽隨機整數(shù)。
一個介于0和RAND_MAX之間的整數(shù)值。
(RAND_MAX為32767)
那為什么說是偽隨機數(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;
}
運行結(jié)果:

大家可以自行嘗試下,代碼兩次運行結(jié)果一模一樣
這也說明了rand生成的數(shù)是偽隨機數(shù)
那該如何生成真正的隨機數(shù)呢?
rand函數(shù)是對?個叫種?的基準值進?運算?成的隨機數(shù)。之所以前?每次運?程序產(chǎn)?的隨機數(shù)序列是?樣的,是因為rand函數(shù)?成隨機數(shù)的默認種?是1。而要想得到真正的隨機數(shù)就要使種子不斷變化。這就可以用到srand函數(shù)。
二、srand函數(shù)
函數(shù)原型:
void srand(unsigned int seed);
srand函數(shù)的使?需要包含?個頭?件:<stdlib.h>
調(diào)?rand函數(shù)之前先調(diào)?srand函數(shù),
通過srand函數(shù)的參數(shù)seed來設(shè)置rand函數(shù)所需要不斷變化的種子,
使得rand函數(shù)生成的是真正的隨機數(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;
}種子不同時運行結(jié)果:


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


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

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

到此這篇關(guān)于C語言rand函數(shù)應(yīng)用(隨機數(shù)的生成)的文章就介紹到這了,更多相關(guān)C語言rand函數(shù)應(yīng)用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
OpenCV實現(xiàn)圖像轉(zhuǎn)換為漫畫效果
這篇文章主要為大家詳細介紹了OpenCV實現(xiàn)圖像轉(zhuǎn)換為漫畫效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-08-08
C++ 二維數(shù)組參數(shù)傳遞的實現(xiàn)方法
這篇文章主要介紹了C++ 二維數(shù)組參數(shù)傳遞的實現(xiàn)方法的相關(guān)資料,這里提供三種方法幫助大家實現(xiàn)這樣的功能,需要的朋友可以參考下2017-08-08
C語言中settimeofday函數(shù)和gettimeofday函數(shù)的使用
這篇文章主要介紹了C語言中的settimeofday函數(shù)和gettimeofday函數(shù)的使用,注意settimeofday()函數(shù)只返回0和-1,需要的朋友可以參考下2015-08-08
用C語言判斷一個二叉樹是否為另一個的子結(jié)構(gòu)
這篇文章主要介紹了用C語言判斷一個二叉樹是否為另一個的子結(jié)構(gòu),是數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)當中的基礎(chǔ)知識,需要的朋友可以參考下2015-08-08
深入探討:main函數(shù)執(zhí)行完畢后,是否可能會再執(zhí)行一段代碼?
本篇文章是對main函數(shù)執(zhí)行完畢后,是否可能會再執(zhí)行一段代碼,進行了詳細的分析介紹,需要的朋友參考下2013-05-05
數(shù)據(jù)結(jié)構(gòu)用兩個棧實現(xiàn)一個隊列的實例
這篇文章主要介紹了C++語言數(shù)據(jù)結(jié)構(gòu)用兩個棧實現(xiàn)一個隊列的實例的相關(guān)資料,需要的朋友可以參考下2017-06-06

