测试理解C++数值库之随机引擎与分布使用

#include<iostream>
#include<random>
#include<algorithm>
#include<vector>
#include<sstream>
#include<map>
#include<iomanip>
using namespace std;

void PrintEngineRandValue(default_random_engine& eg)
{
	for (int i = 0; i < 6; ++i)
	{
		cout << eg() << " ";
	}
	cout << endl;
}

template<typename Distr,typename eng>
void PrintDistr(Distr dis,eng e,const string& name)
{
	cout << name << endl;
	map<long long, int> vc;
	for (int i = 0; i < 2000000; ++i)//2000000次下看各种分布在其默认的最大最小值或者参数设定的范围内的每1个单位精度上的分布情况
	{
		//double d = drr(e);
		vc[dis(e)]++;//根据关联数组算各个随机数分布次数【模拟1个单位的随机数区间的分布情况】
	}
	cout << "===" << endl;
	for (auto& elem : vc)
	{
		cout << setw(3) << elem.first << ": " << elem.second << endl;
	}
	cout << "===" << endl;
}
int main()
{
	//相同状态 相同类型的引擎产生的相同的随机值
	default_random_engine dre;//随机值生成引擎【随机值不同于随机数】【引擎初始状态相同】【引擎随机状态的跳转为新状态也相同-即跳转过程也相同】【伪随机值】【真随机值必须随机去设置这个状态值】
	uniform_int_distribution<int> di(10,20);//随机分布模型
	for (int i = 0; i < 20; ++i)
	{
		cout << di(dre) <<" ";//引擎+分布:生成随机数  
	}
	cout << endl;
	uniform_real_distribution<double> dr(10, 20);
	
	for (int i = 0; i < 8; ++i)
	{
		cout << dr(dre) << " ";
	}
	cout << endl;
	vector<int> v{ 1,2,3,4,5,6,7,8,9 };
	shuffle(v.begin(), v.end(), dre);
	for (auto elem : v)
	{
		cout << elem << endl;
	}

	//引擎与状态
	default_random_engine pl;
	PrintEngineRandValue(pl);

	default_random_engine pk;
	PrintEngineRandValue(pk);

	default_random_engine pg(54);
	PrintEngineRandValue(pg);

	stringstream egstatus;
	egstatus << pl;//状态序列:将形成以空格区分的值序列【不同于随机数与随机值】  //随机数,随机值,状态序列
	PrintEngineRandValue(pl);
	egstatus >> pl;
	PrintEngineRandValue(pl);

	egstatus.clear();
	egstatus.seekg(0);
	egstatus >> pl;
	pl.discard(2);//让引擎pl跳过2个状态
	PrintEngineRandValue(pl);


	//查看各分布
	knuth_b e;
	uniform_real_distribution<> drr(0, 20);
	PrintDistr(drr, e, "uniform_real_distribution");
//	uniform_real_distribution<> drr(0, 20);
	normal_distribution<> zt;
	PrintDistr(zt, e, "normal_distribution");
	exponential_distribution<> ex;
	PrintDistr(ex, e, "exponential_distribution");
	gamma_distribution<> ga;
	PrintDistr(ga, e, "gamma_distribution");

	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值