const類型變量:c生成隨機數代碼

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 的值都是固定的。

C++生成隨機數rand/srand函數

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;
}

運行結果如下:

C++生成隨機數rand/srand函數

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

C++生成隨機數rand/srand函數

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;
}

運行結果如下:

C++生成隨機數rand/srand函數

PS:計算機是一個可預測的系統,因此不可能通過算法來產生真正的隨機數。在計算機中,所謂的隨機數通常都是偽隨機數,即通過隨機算法計算出來的,可以被近似看作隨機數的數值。

常見的隨機數算法有線性同餘法(Linear Congruential Generator)、梅森旋轉法(Mersenne twister)等。

原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/223414.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
投稿專員的頭像投稿專員
上一篇 2024-12-09 14:20
下一篇 2024-12-09 14:20

相關推薦

發表回復

登錄後才能評論