柚子快報激活碼778899分享:【C語言】隨機數(shù)的生成
柚子快報激活碼778899分享:【C語言】隨機數(shù)的生成
?
目錄
一、rand函數(shù)
二、srand函數(shù)
三、time函數(shù)
四、生成指定范圍內的隨機數(shù)
?
一、rand函數(shù)
? ? ? ? 我們想要生成一個隨機數(shù),可以使用rand函數(shù)(隨機數(shù)生成器),rand函數(shù)定義在
int rand(void);
? ? ? ? 它能返回一個 0~RAND_MAX 之間的整數(shù),RAND_MAX的大小由編譯器廠商設定,但一般是32767。可以設置多個隨機數(shù)試一下:
? ? ? ? 重復運行上面的程序,會發(fā)現(xiàn)每次的執(zhí)行結果都一樣,這樣就失去了隨機數(shù)的意義。實際上rand生成的是偽隨機數(shù),這種隨機數(shù)是按照規(guī)定的算法以設置的“種子”值為基準計算出來的,所以本質上是不隨機(按照某種規(guī)則生成)的。因為rand默認種子值是1,所以算法計算的結果都是一樣的。如果想讓每次運行的結果都不同,那么需要讓種子值變化起來。
二、srand函數(shù)
? ? ? ? srand函數(shù)就能用于設置rand函數(shù)的種子值(初始化隨機數(shù)生成器),它也定義在頭文件
void srand(unsigned int seed);
? ? ? ? 現(xiàn)在又有一個問題,如果我們需要讓種子值隨機,但是我們想解決的就是rand生成隨機數(shù)的問題,那不就矛盾了嗎?我們不能得到隨機的種子值,但是能得到變化的種子值,比如根據時間而變化。
三、time函數(shù)
? ? ? ? time函數(shù)能獲得當前的時間戳,時間戳就是當前的時間與計算機的初始時間1970年1月1日0時0分0秒之間的差值,以秒為單位。它定義在
time_t time(time_t *timer);
? ? ? ? 可以看看VS2019?的 time_t的定義:
#ifndef _CRT_NO_TIME_T
#ifdef _USE_32BIT_TIME_T
typedef __time32_t time_t;
#else
typedef __time64_t time_t;
#endif
#endif
typedef long __time32_t;
typedef __int64 __time64_t;
? ? ? ? 本質上 time_t 是32位或64位整型。當time的參數(shù)非NULL時,time函數(shù)不僅會返回時間戳,還會把返回的時間戳存儲在timer指向的內存空間里;當參數(shù)為NULL時,time函數(shù)只返回時間戳。
? ? ? ? 現(xiàn)在有了rand函數(shù)、srand函數(shù)和time函數(shù),就能生成每次運行都不一樣的隨機數(shù)了,如下:
第一次運行
第二次運行
? ? ? ? 最后我們要注意的是,程序中隨機數(shù)種子只需要設置一次就行了,不要把它放在循環(huán)里面,比如這樣:
? ? ? ? 這樣會導致每一輪循環(huán)生成的隨機數(shù)都是一樣的,因為程序執(zhí)行得很快,很多輪循環(huán)都會發(fā)生在同1秒內,導致時間戳沒變,設置的種子值也就不變了??梢钥纯次野蜒h(huán)次數(shù)改為1000后(時間延長),首尾的循環(huán)輪次生成的隨機數(shù)是有變化的:
前面的循環(huán)生成的隨機數(shù)
最后面的循環(huán)生成的隨機數(shù)
四、生成指定范圍內的隨機數(shù)
//生成1~100之間的隨機數(shù)
rand() % 100 // 0~99
rand() % 100 + 1 // 1~100
//生成100~200之間的隨機數(shù)
100 + rand() % (200 - 100 + 1)
//生成a~b之間的隨機數(shù)
a + rand() % (b - a + 1)
五、更正
? ? ? ? 更正一下,上面的要寫成srand((unsigned int) time(NULL))更規(guī)范,因為time函數(shù)返回值是time_t類型,srand函數(shù)參數(shù)是unsigned int類型的。如果不強制轉換VS上也會有警告。為了代碼的可移植性和正確性,還是加上比較好。
?
?
?
柚子快報激活碼778899分享:【C語言】隨機數(shù)的生成
參考文章
本文內容根據網絡資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉載請注明,如有侵權,聯(lián)系刪除。