C語(yǔ)言生成隨機(jī)數(shù)以及設(shè)置隨機(jī)數(shù)范圍的方法(超詳細(xì))
前言
博主將會(huì)這篇文章介紹c語(yǔ)言如何生成隨機(jī)數(shù)以及設(shè)置隨機(jī)數(shù)的范圍。
一、隨機(jī)數(shù)的生成
1.rand函數(shù)
C語(yǔ)言提供了?個(gè)函數(shù)叫 rand,這函數(shù)是可以生成隨機(jī)數(shù)的,函數(shù)原型如下所示:
int rand (void);
- rand函數(shù)會(huì)返回?個(gè)偽隨機(jī)數(shù),這個(gè)隨機(jī)數(shù)的范圍是在0~RAND_MAX之間,這個(gè)RAND_MAX的大小是依賴(lài)編譯器上實(shí)現(xiàn)的,但是大部分編譯器上是32767。
- rand函數(shù)的使用需要包含?個(gè)頭文件是:stdlib.h
那我們可以測(cè)試?下rand函數(shù),這里多調(diào)用幾次,產(chǎn)生5個(gè)隨機(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()); return 0; }
我們可以多運(yùn)行幾次,可以發(fā)現(xiàn):
我們會(huì)發(fā)現(xiàn)一次運(yùn)行中產(chǎn)生的5個(gè)數(shù)字是相對(duì)隨機(jī)的,下一次運(yùn)行程序生成的結(jié)果會(huì)和上一次一模?樣。
如果再深入了解?下,我們就不難發(fā)現(xiàn),其實(shí)rand函數(shù)生成的隨機(jī)數(shù)是偽隨數(shù),偽隨機(jī)數(shù)不是真正的隨機(jī)數(shù),是通過(guò)某種算法生成的隨機(jī)數(shù)。真正的隨機(jī)數(shù)的是無(wú)法預(yù)測(cè)下?個(gè)值是多少的。而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ù),就要讓種子是變化的。
2.srand函數(shù)
C語(yǔ)言中又提供了?個(gè)函數(shù)叫 srand,用來(lái)初始化隨機(jī)數(shù)的生成器的,srand的原型如下:
void srand (unsigned int seed);
- 程序中在調(diào)用 rand 函數(shù)之前先調(diào)用 srand 函數(shù),通過(guò) srand 函數(shù)的參數(shù)seed來(lái)設(shè)置rand函數(shù)生成隨機(jī)數(shù)的時(shí)候的種子,只要種子在變化,每次生成的隨機(jī)數(shù)序列也就變化起來(lái)了。
- 那也就是說(shuō)給srand的種子是如果是隨機(jī)的,rand就能生成隨機(jī)數(shù);在生成隨機(jī)種子的時(shí)候又需要?個(gè)隨機(jī)數(shù),這就矛盾了。
3.time函數(shù)
在程序中我們?般是使用程序運(yùn)行的時(shí)間作為種子的,因?yàn)闀r(shí)間時(shí)刻在發(fā)生變化的。 在C語(yǔ)言中有?個(gè)函數(shù)叫 time ,就可以獲得這個(gè)時(shí)間,time函數(shù)原型如下:
time_t time (time_t* timer);
- time
函數(shù)會(huì)返回當(dāng)前的日歷時(shí)間,其實(shí)返回的是1970年1月1日0時(shí)0分0秒到現(xiàn)在程序運(yùn)行時(shí)間之間的差值,單位是秒。返回的類(lèi)型是time_t類(lèi)型的,time_t 類(lèi)型本質(zhì)上其實(shí)就是32位或者64位的整型類(lèi)型。 - time函數(shù)的參數(shù) timer 如果是非NULL的指針的話,函數(shù)也會(huì)將這個(gè)返回的差值放在timer指向的內(nèi)存中帶回去。
- 如果timer 是NULL,就只返回這個(gè)時(shí)間的差值。time函數(shù)返回的這個(gè)時(shí)間差也被叫做:時(shí)間戳。
- time函數(shù)的時(shí)候需要包含頭文件:time.h
- 如果只是讓time函數(shù)返回時(shí)間戳,我們就可以這樣寫(xiě):
time(NULL);//調(diào)用time函數(shù)返回時(shí)間戳,這里沒(méi)有接收返回值
4.生成隨機(jī)數(shù)的代碼如下:
那樣我們就能把隨機(jī)數(shù)的代碼改寫(xiě)成下面這樣:
#include <stdio.h> #include <stdlib.h> #include <time.h> int main() { //使?time函數(shù)的返回值設(shè)置種? //因?yàn)閟rand的參數(shù)是unsigned int類(lèi)型,我們將time函數(shù)的返回值強(qiáng)制類(lèi)型轉(zhuǎn)換 srand((unsigned int)time(NULL)); printf("%d\n", rand()); printf("%d\n", rand()); printf("%d\n", rand()); printf("%d\n", rand()); printf("%d\n", rand()); return 0; }
多運(yùn)行幾次,會(huì)發(fā)現(xiàn)每次的結(jié)果就會(huì)有所差異。
而且srand函數(shù)是不需要頻繁調(diào)用的,一次運(yùn)行的程序中調(diào)用一次就夠了。
二、設(shè)置隨機(jī)數(shù)的范圍
如果我們要生成0~99之間的隨機(jī)數(shù),方法如下:
rand() %100;
余數(shù)的范圍是0~99
如果要生成1~100之間的隨機(jī)數(shù),方法如下:
rand()%100+1;
%100的余數(shù)是0~ 99,0~ 99的數(shù)字+1,范圍是1~100
同理可得要生成100~200的隨機(jī)數(shù),方法如下:
100 + rand()%(200-100+1)
余數(shù)的范圍是0~ 100,加100后就是100~200
綜上所述,生成a~b范圍的公式為:
a + rand()%(b-a+1)
總結(jié)
本文主要介紹了rand函數(shù)、srand函數(shù)、以及time函數(shù)和時(shí)間戳的概念和如何控制隨機(jī)數(shù)的范圍。
到此這篇關(guān)于C語(yǔ)言如何生成隨機(jī)數(shù)以及設(shè)置隨機(jī)數(shù)的范圍的方法(超詳細(xì))的文章就介紹到這了,更多相關(guān)C語(yǔ)言隨機(jī)數(shù)生成及范圍設(shè)置內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Qt項(xiàng)目實(shí)戰(zhàn)之實(shí)現(xiàn)多文本編輯器
這篇文章主要為大家詳細(xì)介紹了如何利用Qt實(shí)現(xiàn)簡(jiǎn)易的多文本編輯器,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴可以了解一下2023-03-03opencv3/C++ 實(shí)現(xiàn)SURF特征檢測(cè)
今天小編就為大家分享一篇opencv3/C++ 實(shí)現(xiàn)SURF特征檢測(cè),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12OpenCV實(shí)現(xiàn)無(wú)縫克隆算法的步驟詳解
借助無(wú)縫克隆算法,您可以從一張圖像中復(fù)制一個(gè)對(duì)象,然后將其粘貼到另一張圖像中,從而形成一個(gè)看起來(lái)無(wú)縫且自然的構(gòu)圖。本文將詳解OpenCV實(shí)現(xiàn)無(wú)縫克隆算法的步驟,需要的可以參考一下2022-06-06linux安裝mysql和使用c語(yǔ)言操作數(shù)據(jù)庫(kù)的方法 c語(yǔ)言連接mysql
Linux下使用C語(yǔ)言操作數(shù)據(jù)庫(kù)的方法,我將從MySQL環(huán)境的搭建,MySQL命令的使用到使用C接口來(lái)操作MySQL等過(guò)程詳細(xì)的介紹在Linux下管理MySQL數(shù)據(jù)庫(kù)的方法2014-01-01C++鏈表實(shí)現(xiàn)通訊錄設(shè)計(jì)
這篇文章主要為大家詳細(xì)介紹了C++鏈表實(shí)現(xiàn)通訊錄設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06