- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
标准C的随机数很难做到两次随机事件之间没有关联,因为标准C采用的是伪随机数生成器,并不是真随机数。因为随机数生成器的使用对于大多数缺少相关专业知识的人来说是比较难的,在 C++ 11 标准中,又增加了 random 头文件,专门用来生成各种分布随机数,也可以更换其中的随机数发生器源。如果你使用支持 C++11 标准库的新版本的 VC、GCC、Clang 等编译器就可以参考 random - C++ Reference 来使用相应的函数。一方面,你可以不必考虑固定整数范围的基本的随机数源怎么用直接使用uniform_int_distribution和uniform_real_distribution类来生成指定范围的随机整数或浮点数。另一方面,你也可以在使用uniform_int_distribution之类伪随机数类生成随机数时,选择内部状态空间更大、周期更长的发生器如 mt19937(有 19937bit 状态空间)之类。甚至是基于硬件的真随机数发生器random_device。一句话总结:对于非 crypto 级别的随机数,用uniform_int_distribution + mt19937 。std::random_devicerd;std::uniform_int_distributionint dist(0, 9999999);std::coutdist(rd)std::endl;C++11 random1.random_device()标准库提供了一个非确定性随机数生成设备.在Linux的实现中,是读取/dev/urandom设备;Windows的实现居然是用rand_s,在这里强烈谴责一下.random_device提供()操作符,用来返回一个min()到max()之间的一个数字.如果是Linux(Unix Like或者Unix)下,都可以使用这个来产生高质量的随机数,可以理解为真随机数.#include iostream#include randomint main(){std::random_devicerd; for(int n=0; n20000; ++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系统的random_device调用的是rand_s())#include iostream#include randomint main(){std::random_devicerd;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 iostreamint main(){std::random_devicerd;std::mt19937 gen(rd());std::uniform_int_distribution dis(1, 6); for(int n=0; n10; ++n)std::cout dis(gen) ;std::cout \n;}//正态分布#include iostream#include iomanip#include string#include map#include random#include cmathint main(){std::random_devicerd;std::mt19937 gen(rd()); // values near the mean are the most likely // standard deviation affects the dispersion of generated values from the meanstd::normal_distribution d(5,2);std::mapint, int hist; for(int n=0; n10000; ++n) {
文档评论(0)