大家好,我是考100分的小小码 ,祝大家学习进步,加薪顺利呀。今天说一说c++11随机数生成_随机数怎么产生,希望您对编程的造诣更进一步.
前九篇在这里:
C++11新特性之新类型与初始化: blog.guoyb.com/2016/06/18/…
C++11新特性之类型推断与类型获取: blog.guoyb.com/2016/06/25/…
C++11新特性之lambda: blog.guoyb.com/2016/06/30/…
C++11新特性之容器相关特性: blog.guoyb.com/2016/07/09/…
C++11新特性之智能指针: blog.guoyb.com/2016/08/02/…
C++11新特性之Class: blog.guoyb.com/2016/08/14/…
C++11新特性之右值引用与移动: blog.guoyb.com/2016/08/20/…
C++11新特性之template: blog.guoyb.com/2016/08/31/…
C++11新特性之正则表达式: blog.guoyb.com/2016/09/10/…
这是C++11新特性介绍的第十部分,涉及到随机数库相关的新特性。
不想看toy code的读者可以直接拉到文章最后看这部分的总结。
简介
之前,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<
随机分布
可以用uniform_int_distribution和随机引擎配合来产生均匀分布的随机整数。
std::cout<<"test random distribution:\n";
e.seed(time(0));
std::uniform_int_distribution u(0, 9);
for(size_t i = 0; i < 10; i++)
std::cout<
类似的,uniform_real_distribution则可以产生一个均匀分布的实数。
std::cout<<"test real distribution:\n";
e.seed(time(0));
std::uniform_real_distribution u2(0, 1);
for(size_t i = 0; i < 10; i++)
std::cout<
换一个分布,试试正态分布:
std::cout<<"test normal distribution:\n";
e.seed(time(0));
std::normal_distribution<> n(4, 1.5);
std::vector 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<
伯努利分布也是经常会使用到的:
std::cout<<"test bernoulli distribution:\n";
e.seed(time(0));
std::bernoulli_distribution b(0.7);
std::vector bers(2);
for(size_t i = 0; i < 200; i++)
{
if(b(e)) bers[1]++;
else bers[0]++;
}
std::cout<<"True: "<
输出
整个测试程序的输出结果如下:
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.
总结
- C++11新标准中引入了比rand更强大的随机数库。
- 随机数引擎和随机分布类配合,共同产生符合某一分布、在某一范围内的随机数。
完整代码详见random.cpp
转载请注明出处: blog.guoyb.com/2016/09/12/…
欢迎使用微信扫描下方二维码,关注我的微信公众号TechTalking,技术·生活·思考:
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/13679.html