2023年7月31日受降雨天氣影響北京公交線路詳情
2023-07-31
更新時(shí)間:2023-07-31 18:04:25作者:佚名
Matlab內(nèi)置了五種隨機(jī)函數(shù):
rand:生成在(0, 1)之間均勻分布的隨機(jī)數(shù)randn:生成均值為0,方差為1的標(biāo)準(zhǔn)正態(tài)分布的隨機(jī)數(shù)randi(imax):生成在[1, imax] 均勻分布的偽隨機(jī)整數(shù)randsrc(m, n, [alphabet; prob]):生成一個(gè)m-by-n的矩陣,矩陣的元素從alphabet里抽取,alphabet每個(gè)元素被抽中的概率由prob指定。randperm(n):生成一個(gè)1到n的隨機(jī)順序。而C++中要生成隨機(jī)數(shù),通常需要使用rand()和srand()兩個(gè)函數(shù)。
對(duì)于C++ 11之前的隨機(jī)數(shù)生成,只需rand/srand這兩函數(shù)即可,C++11之后提供了更多的選擇和東西,這里暫且不表。
int rand(void);
rand()函數(shù)返回一個(gè) 0 ~ RAND_MAX 之間的整數(shù)。RAND_MAX 是一個(gè)定義在
該函數(shù)返回的數(shù)字實(shí)際上是用算法生成的,實(shí)際上并不是隨機(jī)的。它是根據(jù)種子生成的,根據(jù)不同的種子產(chǎn)生不同的隨機(jī)序列。系統(tǒng)默認(rèn)的種子是1,所以說(shuō)每次使用的隨機(jī)序列都是固定的。
比如下面這段代碼:
#include
運(yùn)行結(jié)果如下圖所示,可以看出,每次運(yùn)行的結(jié)果,x 的值都是固定的。
要想使每次運(yùn)行時(shí)變量 x 的值都不同,就必須使它的種子隨機(jī),這時(shí)就需要用到srand函數(shù)。
void srand(unsigned int seed);
srand()函數(shù)就是用來(lái)設(shè)置rand()函數(shù)的種子的。根據(jù)不同的輸入?yún)?shù)可以產(chǎn)生不同的種子。通常使用time函數(shù)作為srand函數(shù)的輸入?yún)?shù)。
time(NULL);
time函數(shù)會(huì)返回1970年1月1日至今所經(jīng)歷的時(shí)間(以秒為單位)。
在使用 rand() 函數(shù)之前,srand() 函數(shù)要先被調(diào)用,并且在整個(gè)程序中只需被調(diào)用一次。代碼如下:
#include
運(yùn)行結(jié)果如下:
注意:time函數(shù)會(huì)返回的是1970年1月1日至今所經(jīng)歷的時(shí)間(以秒為單位),若你手速足夠快,在1s內(nèi)能夠執(zhí)行多次,即time函數(shù)返回的值相同,x 的值也會(huì)相同。
在實(shí)際應(yīng)用中,通常需要要將隨機(jī)數(shù)的范圍限制在 1 到某個(gè)值 max 之間,則可以使用以下公式:
int var = rand() % max + 1;
求余數(shù)運(yùn)算符(%)可以獲得整除之后的余數(shù)。如當(dāng) max 為 6 時(shí),余數(shù)將是 0 ? 5,給余數(shù)加 1 即可轉(zhuǎn)換為 1 ~ 6。
#include
運(yùn)行結(jié)果如下:
PS:計(jì)算機(jī)是一個(gè)可預(yù)測(cè)的系統(tǒng),因此不可能通過(guò)算法來(lái)產(chǎn)生真正的隨機(jī)數(shù)。在計(jì)算機(jī)中,所謂的隨機(jī)數(shù)通常都是偽隨機(jī)數(shù),即通過(guò)隨機(jī)算法計(jì)算出來(lái)的,可以被近似看作隨機(jī)數(shù)的數(shù)值。
常見(jiàn)的隨機(jī)數(shù)算法有線性同余法(Linear Congruential Generator)、梅森旋轉(zhuǎn)法(Mersenne twister)等。
以上就是本站?c生成隨機(jī)數(shù)代碼(const類型變量)的相關(guān)內(nèi)容了,更多精彩請(qǐng)關(guān)注作者:萬(wàn)年知識(shí)
聲明:本文由本站【創(chuàng)業(yè)者資源平臺(tái)】作者編輯發(fā)布,更多技術(shù)關(guān)注萬(wàn)年技術(shù)!