c語言 生成隨機數 生成隨機數c#



文章插圖
c語言 生成隨機數 生成隨機數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語言 生成隨機數 生成隨機數c#】而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)等 。