在c 11裡產生隨機數

2021-10-09 23:30:43 字數 1780 閱讀 6269

很多人在用c語言產生隨機數時多半會使用鏈結裡給出的方法。這種方法有種缺點,比如,rand()的範圍是[0, 15),那麼,rand() % 10時,9的概率就會小於5。c++11裡面提供了一種解決方案,本文對這個解決方案做乙個簡略地介紹。

這個例子可以當成乙個模板直接套用,不過更好的方法還是自己封裝一下常用的方法。

// ****於 the c++ standard library - 2nd edition

#include #include #include #include int main()

std::cout << std::endl;

// use engine to generate floating-point numbers between 10.0 and 20.0

// (10.0 included, 20.0 not included)

// 常用

std::uniform_real_distributiondr(10,20);

for (int i=0; i<8; ++i)

std::cout << std::endl;

// use engine to shuffle elements

// 打亂陣列

std::vectorv = ;

std::shuffle (v.begin(), v.end(), // range

dre); // source of randomness

for (int i=0; i要產生隨機數,需要兩個部分,一是engine,二是distribution。engine是一種描述隨機性狀態的函式物件,通過特定的演算法產生一系列均勻、預定義的無符號偽隨機數,所以,基本上相同類engine的不同物件在不同平台(default_random_engine在不同的平台上產生的隨機數列可能不一樣)上會產生一系列相同的隨機數列;distribution就是概率論裡的分布,通過傳入的engine產生符合分布的隨機數,一般使用均勻分布。

engine可以簡單看成乙個無限數列,當中的每個值都是乙個狀態,由於engine本身是函式物件,每呼叫一次就會產生乙個無符號隨機數,例如ai,並且改變當前狀態到ai+1。因此,一般來說,如果不提前設定狀態,預設都是從a0 開始,在同一臺電腦上,不同的engine會產生相同的數。為了方便,一般使用default_random_engine:

std::default_random_engine dre;

如果想要每次產生的無符號隨機數不同,則可以考慮時間作為初始狀態:

std::default_random_engine dre(選乙個初始狀態);
或是使用seed()成員函式改變狀態,更多用法這裡。

這個是根據傳入的engine產生符合分布的隨機數,可以是均勻分布,二項分布,正態分佈等等。它會呼叫傳入的engine物件,並且使engine的狀態改變。最常用的均勻分布在例子裡已經給出,更多細節見這裡。

// [**]( example)

#include

#include

#include

intmain()

else

if(number>guess) std::cout <<

"it's greater\n"

;else std::cout <<

"it's less\n";}

return0;

}

C 11產生隨機數

include include include include using namespace std 隨機數的結果一樣 void generate random 1 int num default random engine e 未用時間初始化種子,所以每次結果一樣 uniform int dis...

qt裡產生隨機數

先說一下rand 與srand 這兩個函式的用法 所謂的 偽隨機數 指的並不是假的隨機數,這裡的 偽 是有規律的意思。其實絕對的隨機數只是一種理想狀態的隨機數,計算機只能生成相對的隨機數即偽隨機 數。計算機生成的偽隨機數既是隨機的又是有規律的 一部份遵守一定的規律,一部份則不遵守任何規律。比如 世上...

qt裡產生隨機數

本文摘自 先說一下rand 與srand 這兩個函式的用法 所謂的 偽隨機數 指的並不是假的隨機數,這裡的 偽 是有規律的意思。其實絕對的隨機數只是一種理想狀態的隨機數,計算機只能生成相對的隨機數即偽隨機 數。計算機生成的偽隨機數既是隨機的又是有規律的 一部份遵守一定的規律,一部份則不遵守任何規律。...