这是C++11新特性详情的第十部分,涉及到随机数库相关的新特性。
不想细看的读者可以直接拉到文章最后看这部分的总结。
之前,C++中的随机数生成都依赖于一个简单的rand函数。这个函数产生肯定范围内的一个均匀随机整数。假如需要其余随机分布或者者其余范围的随机数,就需要根据rand函数产生的随机数进行再加工,不过这时,就容易引入非随机性了。
C++11新标准中引入了一个新的随机数库,相关功能定义在random头文件中,通过多个互相协作的类,可以生成任意范围内、服从多种随机分布的随机数。
新的随机数库中引入了随机引擎的概念。一个随机引擎将产生一组原始的随机数列,一般这些原始的随机数不能直接使用,要配合随机分布类产生符合某分布的随机数后才能进行使用。
一般,最常用的随机引擎是default_random_engine。
std::cout<<"test default random engine:\n";
std::default_random_engine e;
e.seed(time(0));
for(size_t i = 0; i < 10; i++)
std::cout<<e()<<'\t';
std::cout<<'\n';
std::cout<<"test default random engine done.\n"<<std::endl;
可以用uniform_int_distribution和随机引擎配合来产生均匀分布的随机整数。
std::cout<<"test random distribution:\n";
e.seed(time(0));
std::uniform_int_distribution<unsigned> u(0, 9);
for(size_t i = 0; i < 10; i++)
std::cout<<u(e)<<'\t';
std::cout<<'\n';
std::cout<<"test random distribution done.\n"<<std::endl;
相似的,uniform_real_distribution则可以产生一个均匀分布的实数。
std::cout<<"test real distribution:\n";
e.seed(time(0));
std::uniform_real_distribution<double> u2(0, 1);
for(size_t i = 0; i < 10; i++)
std::cout<<u2(e)<<'\t';
std::cout<<'\n';
std::cout<<"test real distribution done.\n"<<std::endl;
换一个分布,试试正态分布:
std::cout<<"test normal distribution:\n";
e.seed(time(0));
std::normal_distribution<> n(4, 1.5);
std::vector<unsigned> vals(9);
for(size_t i = 0; i < 250; i++)
{
unsigned v = lround(n(e));
if(v < vals.size()) vals[v]++;
}
for(size_t i = 0; i < vals.size(); i++)
{
std::cout<<i<<": "<<std::string(vals[i], '*')<<std::endl;
}
std::cout<<"test normal distribution done.\n"<<std::endl;
伯努利分布也是经常会使用到的:
std::cout<<"test bernoulli distribution:\n";
e.seed(time(0));
std::bernoulli_distribution b(0.7);
std::vector<unsigned> bers(2);
for(size_t i = 0; i < 200; i++)
{
if(b(e)) bers[1]++;
else bers[0]++;
}
std::cout<<"True: "<<bers[1]<<std::endl;
std::cout<<"False: "<<bers[0]<<std::endl;
std::cout<<"test bernoulli distribution done.\n";
输出
整个测试程序的输出结果如下:
test default random engine:
1446291605??????455604842?????? 1571377939??????395129967?????? 929918845?????? 1907528696??????51427609????????1055398369??????2012947210??????146383632
test default random engine done.
test random distribution:
6?????? 2?????? 7?????? 1?????? 4?????? 8?????? 0?????? 4?????? 9?????? 0
test random distribution done.
test real distribution:
0.212158????????0.183997????????0.888262????????0.491458????????0.0681652?????? 0.173643????????0.128234????????0.954471????????0.891836????????0.912416
test real distribution done.
test normal distribution:
0: **
1: ********
2: ******************************
3: *************************************************
4: *****************************************************************
5: *******************************************************
6: *****************************
7: *********
8: *
test normal distribution done.
test bernoulli distribution:
True: 132
False: 68
test bernoulli distribution done.
(1)C++11新标准中引入了比rand更强大的随机数库。
(2)随机数引擎和随机分布类配合,共同产生符合某一分布、在某一范围内的随机数。
标签:
本文链接:https://www.wsx6.cn/post/527.html
版权声明:
1:如非特殊说明,本站对提供的源码不拥有任何权利,其版权归原著者拥有。
2:请勿将该源码、软件进行商业交易、转载等行为,该源码、软件只为研究、学习所提供,该软件使用后发生的一切问题与本站无关。
3:本网站所有源码和软件均为作者提供和网友推荐收集整理而来,仅供学习和研究使用。如有侵犯你版权的,请来信(邮箱:393249296@qq.com)指出,本站将立即改正。
上一篇:java中堆和栈的区别是什么?
下一篇:谈谈Java 对象之死