[C++11]C++11带来的随机数生成器
来源:互联网 发布:港股金山软件 编辑:程序博客网 时间:2024/06/07 12:49
http://www.cnblogs.com/egmkang/archive/2012/09/06/2673253.html
[C++11]C++11带来的随机数生成器
C++11带来诸多特性,random就是其一.
1. random_device
标准库提供了一个非确定性随机数生成设备.在Linux的实现中,是读取/dev/urandom设备;Windows的实现居然是用rand_s,在这里强烈谴责一下.
random_device提供()操作符,用来返回一个min()到max()之间的一个数字.如果是Linux(Unix Like或者Unix)下,都可以使用这个来产生高质量的随机数,可以理解为真随机数.
#include <iostream>#include <random>int main(){ std::random_device rd; for(int n=0; n<20000; ++n) std::cout << rd() << std::endl; return 0; }
2. random number engine
标准把随机数抽象成随机数引擎和分布两部分.引擎用来产生随机数,分布产生特定分布的随机数(比如平均分布,正太分布等).
标准提供三种常用的引擎:linear_congruential_engine,mersenne_twister_engine和subtract_with_carry_engine.第一种是线性同余算法,第二种是梅森旋转算法,第三种带进位的线性同余算法.第一种是最常用的,而且速度也是非常快的; 第二种号称是最好的伪随机数生成器;第三种没用过....
随机数引擎接受一个整形参数当作种子,不提供的话,会使用默认值. 推荐使用random_device来产生一个随机数当作种子.(windows下爱咋整咋整,谁叫windows的random_device是调用rand_s)
#include <iostream>#include <random>int main(){ std::random_device rd; std::mt19937 mt(rd()); for(int n = 0; n < 10; n++) std::cout << mt() << std::endl; return 0;}
3. random number distributions
标准提供各种各样的分布,不过我们经常用的比较少,比如平均分布,正太分布...使用也很简单
//平均分布#include <random>#include <iostream>int main(){ std::random_device rd; std::mt19937 gen(rd()); std::uniform_int_distribution<> dis(1, 6); for(int n=0; n<10; ++n) std::cout << dis(gen) << ' '; std::cout << '\n';}
//正太分布#include <iostream>#include <iomanip>#include <string>#include <map>#include <random>#include <cmath>int main(){ std::random_device rd; std::mt19937 gen(rd()); // values near the mean are the most likely // standard deviation affects the dispersion of generated values from the mean std::normal_distribution<> d(5,2); std::map<int, int> hist; for(int n=0; n<10000; ++n) { ++hist[std::round(d(gen))]; } for(auto p : hist) { std::cout << std::fixed << std::setprecision(1) << std::setw(2) << p.first << ' ' << std::string(p.second/200, '*') << '\n'; }}
参考:
1. http://en.cppreference.com/w/cpp/numeric/random
2. windows下的高质量随机数生成器,参考CryptGenRandom API, 以及http://www.cnblogs.com/egmkang/archive/2011/03/05/1971586.html
/**********************************************************************
* 机械教条主义
*
* From: http://www.cnblogs.com/egmkang/
* Email: egmkang [at] 163.com
* QQ Group: 20240291(慎入,可能没人打理)
* Weibo: http://weibo.com/egmkang
*
**********************************************************************/
- C++11带来的随机数生成器
- [C++11]C++11带来的随机数生成器
- [C++11]C++11带来的随机数生成器
- 随机数生成器C语言
- C随机数生成器的实现分析
- 【C++】C++11特性:初始化、hash容器和随机数生成器
- C语言中的随机数生成器
- [C++] C++11给我们带来的新特性
- C语言中如何写一个简单可移植而又足够随机的随机数生成器
- obj-c编程15[Cocoa实例01]:一个会发声的随机数生成器
- 明明的随机数(C/C++)
- C语言下泊松分布以及指数分布随机数生成器实现
- C++ 自定义随机数生成器的使用 <random> 参照C++11
- c的随机数
- 关于c的随机数
- C语言的随机数
- 【C++】明明的随机数
- 严格的随机数生成器
- 死锁
- JS修改CKEDITOR的textarea内容
- Android 自动编译、打包生成apk文件 3 - 使用SDK Ant方式
- 专家称航班遇险后两小时系搜救黄金时间
- iOS 3D效果的界面选择Demo
- [C++11]C++11带来的随机数生成器
- tomcat修改应用程序默认路径和端口
- Android 自动编译、打包生成apk文件 4 - 多渠道批量打包
- Struts2配置文件result的name和type属性
- 蓝桥杯 最大最小公倍数
- 呼叫中心话务中心建设
- 画原型图时我们需要注意些什么
- 最大流与最小割C++实现2——深度优先搜索
- 第一个成功复制小米粉丝营销的屌丝案例