Matlab內置了五種隨機函數:
- rand:生成在(0, 1)之間均勻分布的隨機數
- randn:生成均值為0,方差為1的標準正態分布的隨機數
- randi(imax):生成在[1, imax] 均勻分布的偽隨機整數
- randsrc(m, n, [alphabet; prob]):生成一個m-by-n的矩陣,矩陣的元素從alphabet里抽取,alphabet每個元素被抽中的概率由prob指定。
- randperm(n):生成一個1到n的隨機順序。
而C++中要生成隨機數,通常需要使用rand()和srand()兩個函數。
對於C++ 11之前的隨機數生成,只需rand/srand這兩函數即可,C++11之後提供了更多的選擇和東西,這裡暫且不表。
1、rand函數
int rand(void);rand()函數返回一個 0 ~ RAND_MAX 之間的整數。RAND_MAX 是一個定義在 <cstdlib> 的常數。
該函數返回的數字實際上是用算法生成的,實際上並不是隨機的。它是根據種子生成的,根據不同的種子產生不同的隨機序列。系統默認的種子是1,所以說每次使用的隨機序列都是固定的。
比如下面這段代碼:
#include <iostream>
using namespace std;
int main()
{
cout << "RAND_MAD: " << RAND_MAX << endl;
int x = rand();
cout << "x: " << x << endl;
return 0;
}運行結果如下圖所示,可以看出,每次運行的結果,x 的值都是固定的。

2、srand函數
要想使每次運行時變量 x 的值都不同,就必須使它的種子隨機,這時就需要用到srand函數。
void srand(unsigned int seed);srand()函數就是用來設置rand()函數的種子的。根據不同的輸入參數可以產生不同的種子。通常使用time函數作為srand函數的輸入參數。
time(NULL);time函數會返回1970年1月1日至今所經歷的時間(以秒為單位)。
在使用 rand() 函數之前,srand() 函數要先被調用,並且在整個程序中只需被調用一次。代碼如下:
#include <iostream>
using namespace std;
int main()
{
srand(time(0));
int x = rand();
cout << "x: " << x << endl;
return 0;
}運行結果如下:

注意:time函數會返回的是1970年1月1日至今所經歷的時間(以秒為單位),若你手速足夠快,在1s內能夠執行多次,即time函數返回的值相同,x 的值也會相同。

3、指定隨機數的範圍
在實際應用中,通常需要要將隨機數的範圍限制在 1 到某個值 max 之間,則可以使用以下公式:
int var = rand() % max + 1;求餘數運算符(%)可以獲得整除之後的餘數。如當 max 為 6 時,餘數將是 0 〜 5,給餘數加 1 即可轉換為 1 ~ 6。
#include <iostream>
using namespace std;
int main()
{
srand(time(0));
int x = rand() % 6 + 1;
cout << "x: " << x << endl;
return 0;
}運行結果如下:

PS:計算機是一個可預測的系統,因此不可能通過算法來產生真正的隨機數。在計算機中,所謂的隨機數通常都是偽隨機數,即通過隨機算法計算出來的,可以被近似看作隨機數的數值。
常見的隨機數算法有線性同餘法(Linear Congruential Generator)、梅森旋轉法(Mersenne twister)等。
原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/223414.html
微信掃一掃
支付寶掃一掃