C語言生成隨機數(shù)以及設(shè)置隨機數(shù)范圍的方法(超詳細)
前言
博主將會這篇文章介紹c語言如何生成隨機數(shù)以及設(shè)置隨機數(shù)的范圍。
一、隨機數(shù)的生成
1.rand函數(shù)
C語言提供了?個函數(shù)叫 rand,這函數(shù)是可以生成隨機數(shù)的,函數(shù)原型如下所示:
int rand (void);
- rand函數(shù)會返回?個偽隨機數(shù),這個隨機數(shù)的范圍是在0~RAND_MAX之間,這個RAND_MAX的大小是依賴編譯器上實現(xiàn)的,但是大部分編譯器上是32767。
- rand函數(shù)的使用需要包含?個頭文件是:stdlib.h
那我們可以測試?下rand函數(shù),這里多調(diào)用幾次,產(chǎn)生5個隨機數(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; }
我們可以多運行幾次,可以發(fā)現(xiàn):
我們會發(fā)現(xiàn)一次運行中產(chǎn)生的5個數(shù)字是相對隨機的,下一次運行程序生成的結(jié)果會和上一次一模?樣。
如果再深入了解?下,我們就不難發(fā)現(xiàn),其實rand函數(shù)生成的隨機數(shù)是偽隨數(shù),偽隨機數(shù)不是真正的隨機數(shù),是通過某種算法生成的隨機數(shù)。真正的隨機數(shù)的是無法預(yù)測下?個值是多少的。而rand函數(shù)是對?個叫“種子”的基準值進行運算生成的隨機數(shù)。
之所以前面每次運行程序產(chǎn)生物的隨機數(shù)序列是?樣的,那是因為rand函數(shù)生成隨機數(shù)的默認種子是1。如果要生成不同的隨機數(shù),就要讓種子是變化的。
2.srand函數(shù)
C語言中又提供了?個函數(shù)叫 srand,用來初始化隨機數(shù)的生成器的,srand的原型如下:
void srand (unsigned int seed);
- 程序中在調(diào)用 rand 函數(shù)之前先調(diào)用 srand 函數(shù),通過 srand 函數(shù)的參數(shù)seed來設(shè)置rand函數(shù)生成隨機數(shù)的時候的種子,只要種子在變化,每次生成的隨機數(shù)序列也就變化起來了。
- 那也就是說給srand的種子是如果是隨機的,rand就能生成隨機數(shù);在生成隨機種子的時候又需要?個隨機數(shù),這就矛盾了。
3.time函數(shù)
在程序中我們?般是使用程序運行的時間作為種子的,因為時間時刻在發(fā)生變化的。 在C語言中有?個函數(shù)叫 time ,就可以獲得這個時間,time函數(shù)原型如下:
time_t time (time_t* timer);
- time
函數(shù)會返回當前的日歷時間,其實返回的是1970年1月1日0時0分0秒到現(xiàn)在程序運行時間之間的差值,單位是秒。返回的類型是time_t類型的,time_t 類型本質(zhì)上其實就是32位或者64位的整型類型。 - time函數(shù)的參數(shù) timer 如果是非NULL的指針的話,函數(shù)也會將這個返回的差值放在timer指向的內(nèi)存中帶回去。
- 如果timer 是NULL,就只返回這個時間的差值。time函數(shù)返回的這個時間差也被叫做:時間戳。
- time函數(shù)的時候需要包含頭文件:time.h
- 如果只是讓time函數(shù)返回時間戳,我們就可以這樣寫:
time(NULL);//調(diào)用time函數(shù)返回時間戳,這里沒有接收返回值
4.生成隨機數(shù)的代碼如下:
那樣我們就能把隨機數(shù)的代碼改寫成下面這樣:
#include <stdio.h> #include <stdlib.h> #include <time.h> int main() { //使?time函數(shù)的返回值設(shè)置種? //因為srand的參數(shù)是unsigned int類型,我們將time函數(shù)的返回值強制類型轉(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; }
多運行幾次,會發(fā)現(xiàn)每次的結(jié)果就會有所差異。
而且srand函數(shù)是不需要頻繁調(diào)用的,一次運行的程序中調(diào)用一次就夠了。
二、設(shè)置隨機數(shù)的范圍
如果我們要生成0~99之間的隨機數(shù),方法如下:
rand() %100;
余數(shù)的范圍是0~99
如果要生成1~100之間的隨機數(shù),方法如下:
rand()%100+1;
%100的余數(shù)是0~ 99,0~ 99的數(shù)字+1,范圍是1~100
同理可得要生成100~200的隨機數(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ù)的范圍。
到此這篇關(guān)于C語言如何生成隨機數(shù)以及設(shè)置隨機數(shù)的范圍的方法(超詳細)的文章就介紹到這了,更多相關(guān)C語言隨機數(shù)生成及范圍設(shè)置內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
linux安裝mysql和使用c語言操作數(shù)據(jù)庫的方法 c語言連接mysql
Linux下使用C語言操作數(shù)據(jù)庫的方法,我將從MySQL環(huán)境的搭建,MySQL命令的使用到使用C接口來操作MySQL等過程詳細的介紹在Linux下管理MySQL數(shù)據(jù)庫的方法2014-01-01