随机数咔咔

随机数是模拟偶然事件时必不可少的。
自然的偶然事件的随机是真随机=,,=, 比如分子的热运动,是一堆杂乱无章无法预测的球球。

计算机中的随机是伪随机。通过算法来实现近似的随机。

非常常见的做法:
伪随机生成器
按照一个种子生成一组数列
生成的随机数想要接近真随机
1 种子足够多,种子本身足够随机
2 由算法生成的随机数,是一个由种子决定的数列,所以如果这个数列足够大,也可以做到近似随机。

一般我们需要随机数的时候,会这么写
srand(time(null)) 生成种子
rand() 生成 线性同余随机数
这种做法显然是伪随机,因为种子是当前时间,而当前时间是不具有随机性的。是一个会累加的东西。

计算机想要真随机,必须由一个真随机的物理事件推动。比如物理中的分子热运动。

随机数生成时需要注意的东西。
生成一个区间[a,b]之间 均匀选择的一个数
一般做法 : (rand()%(b-a+1))+a
这样做时,只有当 (b-a+1)可以整除 RAND_MAX + 1
在所有随机数范围内 [0,RAND_MAX],需要的数据 [a,b]才是出现次数相同的。

例如:
生成[0,32766]间的数字,0的概率大于其他数字(随到0和32766时)

解决方案是 将随机输出缩放到[0,1]
然后再放大到[a,b]

以上介绍的随机是均匀随机,即产生的随机数是均匀分布的,数值在[0,RAND_MAX]
有的时候,为了更接近需求,会需要一些非均匀产生的随机数
例如高斯分布随机数(正态分布..正太。。)
正态分布依然需要依靠均匀分布来提供随机种子(种子是随机的来源,触发者)。
再使用正态分布公式得到正态分布的随机数即可。

正常计算的高斯随机数需要开放运算,稍有效率问题,开方可以使用类似泰勒展开等估算。
对于一些对精度要求并不高的场合可以考虑使用。

随机抽取。
这个是随机的一个应用,比如出题系统,就需要打乱题库,不放回抽取。
这里说一个关于抽取的思路,在一个博客里看到的。
不放回抽取,题库索引存在数组里,如果每抽一个就从数组中去除一个,数组的删除操作会带来较大开销。
此时考虑,抽取之后,把抽取位置和数组末尾元素对换,下次抽取下标[0,n-1]。(^__^)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值