msdn是什么_【三保三促】为什么我的随机数不随机?

7

星期一

2020年06月

闰四月十六

考试必过!

Pass!

640d1663a6eed7e1c54fc027d1769e5b.png

为什么我的随机数不随机?

在不同的编程语言中,往往有不同的产生随机数的方法。但是这些或多或少都不是真正的随机数,多次运行产生的结果均相同或是有规律。这是因为随机数生产的算法是固定的。随机数的产生都要依靠一个“种子”,在这个种子上进行计算后便可生成随机数。

例如我们最常用的rand()函数,它的内部实现就是用线性同余法做的,在一定的范围(0~32767)内可以看做是随机的伪随机数。

9c7d96bded41b10b340556153cd11617.png

接下来,我们来看一下几种真·随机数的产生方法:

使用rand()函数

首先,我们要包含头文件cstdlib.h。

然后,在调用rand()函数前,我们可以先调用srand()函数来重置种子。种子应作为参数传递给srand()函数。因此我们要保证每次运行程序是种子都是不一样的。为此,我们可以利用C++中的time()函数,在每次运行程序时将当前时间作为变量传给srand()。

注意:只能在程序开始时调用一次srand()函数!多次调用会对随机数产生造成不利影响!

随后,通过取模运算,我们就可以产生一个一定范围的随机数了。比如:

r = (rand() % 10) + 1;

可以产生一个范围1~10的随机数。

01e35d90385d2bf9dfd0b655ee44101c.png

使用random库

C++11中引入了random库。它提供给了我们更多的选项,而其中任何一个选项都比来自C的rand()这个过时的函数要好。

random库中还包含有常见的概率分布函数。

要使用random库生成随机数。首先要新建一个生成器(generator),然后需要新建一个分布类(distribution),利用它来产生一个符合概率分布的随机数。

废话不多说(说不过来),下面直接上代码:

产生0~99的随机整型数:

fe1318ca4994a118a252f7ba32762a44.png

一个高性能,灵活且线程安全的模板:

34781e0e49e54d14385259a387a79178.png

亿点点拓展

事实上,rand()是一个具有严重缺陷的函数,应当能不用尽量不用。2013年,微软的首席软件工程师Stephan T. Lavavej在Going Native活动上发表了演说,详细解释了为什么rand()函数是“有害的”,并介绍了应当如何正确使用random库。

视频链接:

http://channel9.msdn.com/Events/GoingNative/2013/rand-Considered-Harmful

3166ab075909fff049e18867123b2f57.png 1613814815265e40e95fe8d93daee54c.png

自习室榜单

075acfb4817e2f8895558e02820a668b.png 6d42b2e9877e27483d1cadf81f3684ad.png

图文:胡杨

排版:胡杨

审核:刘海伦老师

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值