隨機(jī)數(shù)生成代碼:
先上代碼,再詳細(xì)解釋?zhuān)?/p>
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
srand((unsigned int)time(NULL));
//隨機(jī)數(shù)生成器
int ret = rand()%100+1;
//隨機(jī)數(shù)賦值,和范圍限定
printf("%d\n", ret);
return 0;
}
rand函數(shù):
- 我們先來(lái)查詢(xún)下rand函數(shù)
- 網(wǎng)站舊版我放在這兒,可以查詢(xún)庫(kù)函數(shù)等https://legacy.cplusplus.com/reference/cstring/strcat/
-
- rand函數(shù)的頭文件是<stdlib.h>。
-
- rand函數(shù)無(wú)需傳參數(shù),返回類(lèi)型是一個(gè)偽隨機(jī)的整數(shù)范圍是0到RAND_MAX。那這個(gè)RAND_MAX所對(duì)應(yīng)的值是多少呢?我們同樣來(lái)查詢(xún)下RAND_MAX。
這里就明確表明了他對(duì)應(yīng)的整數(shù)值:32767.
-
- rand函數(shù)范圍限定:原本rand函數(shù)范圍0~32767范圍很廣,我們往往不需要這么大,所以就需要規(guī)劃rand函數(shù)返回值在我們需要的范圍內(nèi),通過(guò)下面的方式來(lái):
-
- 從rand函數(shù)介紹第二段我們了解到,這個(gè)數(shù)字是由一個(gè)算法生成的,該算法每次調(diào)用時(shí)都返回一個(gè)明顯不相關(guān)的數(shù)字序列。該算法使用種子來(lái)生成序列,該序列應(yīng)該使用函數(shù)srand初始化為一些獨(dú)特的值。
- srand函數(shù)(提供)------>算法數(shù)列(決定)----->rand函數(shù)返回值
偽隨機(jī)數(shù):
rand函數(shù)返回的是偽隨機(jī)數(shù),也就是說(shuō)他返回的并不是真正的隨機(jī)數(shù),而是一個(gè)在那個(gè)范圍內(nèi)的一個(gè)固定整數(shù)。比如:我用VS2019編譯打印出來(lái)固定是41;
- 這個(gè)時(shí)候我們就要用到一個(gè)隨機(jī)的種子,來(lái)隨機(jī)算法數(shù)列也就完成了隨機(jī)rand函數(shù)返回值。
?????什么呆呆你在開(kāi)玩笑吧,我要rand產(chǎn)生一個(gè)隨機(jī)數(shù),現(xiàn)在你又要一個(gè)隨機(jī)數(shù)種子來(lái)完成,這不是開(kāi)玩笑嗎?
?。?!??是的,沒(méi)有在開(kāi)玩笑,還記得這句話(huà)嗎?rand函數(shù)無(wú)需傳參數(shù) 這里也就表示了無(wú)法輸入值進(jìn)行更改,而是由本身函數(shù)算法決定返回值所以我們就引入可串參數(shù)改變的srand函數(shù);
srand函數(shù):
- 我們查詢(xún)下srand函數(shù).
傳入的參數(shù)是無(wú)符號(hào)整形種子,所以在上述隨機(jī)值代碼中強(qiáng)制類(lèi)型轉(zhuǎn)換了time函數(shù)返回值
這里每句話(huà)都是關(guān)鍵,所以我提供一張翻譯的圖
從結(jié)合上述內(nèi)容我們已經(jīng)完全就清楚了,我們就徹底清楚原因了。
這里我們就不過(guò)多贅述,就主要看下最后一段
為了生成類(lèi)似隨機(jī)的數(shù)字,srand通常被初始化為一些獨(dú)特的運(yùn)行時(shí)值,比如函數(shù)time返回的值(在頭中聲明)。這對(duì)于大多數(shù)瑣碎的隨機(jī)化需求來(lái)說(shuō)是足夠獨(dú)特的。
這里提到了函數(shù)time函數(shù)返回值,所以又要引入time函數(shù);
time函數(shù):
- 老規(guī)矩,我們先來(lái)查詢(xún)下time函數(shù).
- 這里我們就只需要了解time函數(shù)頭文件<time.h>,返回類(lèi)型是time_t(也就是long int類(lèi)型),也就是返回時(shí)間戳,傳入?yún)?shù)為時(shí)間指針,還有個(gè)時(shí)間戳的概念:說(shuō)我們當(dāng)前時(shí)間到1970年1月1日00:00小時(shí)以來(lái)的秒數(shù)(即當(dāng)前unix時(shí)間戳)。
time函數(shù)補(bǔ)充:
- 算了,我還是多講一些time函數(shù)吧,這里與隨機(jī)值無(wú)關(guān):
time_t time( time_t *timer );
time_t類(lèi)型討論
time_t是(long還是long long的討論),能確定的是time_t始終占8個(gè)字節(jié)
從這位大佬總結(jié)的圖中,我們就很清楚的認(rèn)識(shí)到,討論應(yīng)當(dāng)先分平臺(tái),在分多少位;
- 總結(jié):若在Windows平臺(tái)全是long long,Linux平臺(tái)32位為long,64位為long long。
這里就要注意項(xiàng)目轉(zhuǎn)平臺(tái)時(shí)要調(diào)整。
time_t指針傳入的討論:
返回值如上面所說(shuō),返回時(shí)間戳(當(dāng)前時(shí)間到1970年1月1日00:00小時(shí)以來(lái)的秒數(shù));
-
- 當(dāng)傳入的time_t指針為空指針(NULL)時(shí),不會(huì)將返回值賦值到time_t指針指向的空間里;
-
- 當(dāng)傳入的time_t指針不為空指針(NULL)時(shí),會(huì)將返回值賦值到time_t指針指向的空間里;(不好演示證明)
代碼演示證明:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-718432.html
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
time_t a = 1;
srand((unsigned int)time(&a));
printf("%lld\n", a);
time_t b = 2;
srand((unsigned int)time(&b));
printf("%lld\n", b);
srand((unsigned int)time(NULL));
return 0;
}
總結(jié):文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-718432.html
- 這個(gè)代碼的實(shí)現(xiàn)為我們后面的許多項(xiàng)目設(shè)計(jì)提供了一定的基礎(chǔ);
- 要注意頭文件,參數(shù)的傳入類(lèi)型,返回值類(lèi)型;
- time函數(shù)(隨機(jī)種子提供)------>srand函數(shù)(提供)------>算法數(shù)列(決定)------>rand函數(shù)返回值------>限制所需范圍
到了這里,關(guān)于C語(yǔ)言隨機(jī)數(shù)的產(chǎn)生(rand、srand、time函數(shù)細(xì)節(jié)講解)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!