随机数的正确打开方式

本文讨论了为何不应使用rand()生成随机数,并介绍了C++11新标准库中的随机数及其分布,强调了正确使用随机数引擎和分布的重要性,同时提醒注意多线程环境下的线程安全和避免取余操作导致的不均匀分布问题。
摘要由CSDN通过智能技术生成

layout: post
title: “随机数浅谈”
subtitle: “随机数的正确打开方式”
date: “2017-04-18”
author: “cj”
tags:
random
c++
c++11

随机数

坏例子:不要使用rand()

注:截图来自rand() Considered Harmfulyoutube上也有,演讲者为Stephan T. Lavavej。

img

Stephan 列出了如下缺陷:

  • 不应该使用NULL,而应该使用nullptr
  • time()调用时钟周期为1Hz,速度慢
  • time()返回值为time_t,隐式转换到srand所需的unsigned int导致编译器产生C4244警告
  • srand()接收一个32-bit的种子,精度低
  • rand()返回值范围过小[0, 32767]
  • 对rand()取余导致结果很大概率上不是均匀分布
  • rand()采用线性同余算法,质量低

即使假设rand()结果均匀分布,使用取余(%)仍然有问题:

img

明显可以得知,当取余对象不能被rand()范围整除时,有一部分数值产生的余数概率略低。上图的例子中,整百数到整百数+99共100个数字可以均匀得到[0,99]之间的结果,但[32700,32767]内只能产生[0,67]之间的结果。

Accelerated C++ 7.4.4节对此有更详尽的描述:

  1. 当商(quotient)被当做n且为小整数时,许多伪(pseudo)随机数生成器制造出来的余数(remainder)并不很随机。例如rand()的连续执行结果非偶即奇(这并不十分罕见),这种情况下如果n是2,连续执行rand()%n获得的不是0就是1。

  2. 另一方面,如果n是大数,且被

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值