前言
C++11中提供了隨機數庫,包括隨機數引擎類(random-number engines)和隨機數分佈類(random-number distribution)。頭文件爲#include
隨機數引擎:是隨機數的生成器,會隨機產生均勻的隨機值,他們被隨機均勻的分佈在一個預定義最小(min())和最大(max())值之間,需要一個種子。
隨機數分佈:將隨機產生的值轉換爲隨機數,並且映射到其他分佈之中。
隨機數引擎基本操作
#include <random>
std::random_device seed_device;
std::default_random_engine engine(seed_device());//通過operator()取得設備產生的隨機值
//std::default_random_engine engine; //使用默認的種子,其生成的隨機數範圍是由系統定義的,可以由 engine.min() 和 engine.max() 函數來查看
std::mt19937 rng;
rng.seed(std::random_device()());
std::uniform_int_distribution<std::mt19937::result_type> dist6(1, 6);
隨機數分佈基本操作
分佈即是把引擎產生的隨機值映射到其他常見的分佈,如均勻分佈uniform,正態分佈normal。
//均勻分佈
uniform_int_distribution //指定範圍的隨機非負整數
uniform_real_distribution //指定範圍的隨機實數
//伯努利類型分佈
bernoulli_distribution //伯努利分佈
binomial_distribution // 二項分佈
geometry_distribution //幾何分佈
negative_biomial_distribution // 負二項分佈
//正態類型分佈
normal_distribution //正態分佈
chi_squared_distribution //卡方分佈
cauchy_distribution //柯西分佈
fisher_f_distribution //費歇爾F分佈
student_t_distribution //t分佈
//分佈提供的一些基本操作;
std::uniform_int_distribution<int> distr(10,100);//10到100,int類型,均勻分佈
生成均勻分佈的整數
#include <iostream>
#include <string>
#include <random>
using namespace std;
int main()
{
std::random_device seed_device;
std::default_random_engine engine(seed_device());
//產生[1,10]隨機整數,均勻分佈
std::uniform_int_distribution<int> distr(1,10);
for (int i = 0; i < 10 ; ++i)
{
cout << distr(engine) << endl;
}
engine.seed(); // 如果不傳進種子的話,該引擎的狀態被回置以後,將會產生同樣的值
for (int i = 0; i < 10; ++i)
{
cout << distr(engine) << endl;
}
return 0;
}
生成均勻分佈的實數
#include <iostream>
#include <string>
#include <random>
using namespace std;
int main()
{
std::random_device seed_device;
std::default_random_engine engine(seed_device());
//產生[1,10]隨機實數,均勻分佈
std::uniform_real_distribution<double> distr(1, 10);
for (int i = 0; i < 10; ++i)
{
cout << distr(engine) << endl;
}
engine.seed(); // 如果不傳進種子的話,該引擎的狀態被回置以後,將會產生同樣的值
for (int i = 0; i < 10; ++i)
{
cout << distr(engine) << endl;
}
return 0;
}
生成正態分佈的實數
#include <iostream>
#include <string>
#include <random>
using namespace std;
int main()
{
std::random_device seed_device;
std::default_random_engine engine(seed_device());
//產生均值是5,方差是1的正態分佈
std::normal_distribution<double> distr(5,1);
for (int i = 0; i < 10; ++i)
{
cout << distr(engine) << endl;
}
engine.seed(); // 如果不傳進種子的話,該引擎的狀態被回置以後,將會產生同樣的值
for (int i = 0; i < 10; ++i)
{
cout << distr(engine) << endl;
}
return 0;
}
參考
https://docs.microsoft.com/en-us/cpp/standard-library/random?view=vs-2019