C++隨機數

前言

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

http://www.cplusplus.com/reference/random/?kw=random

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章