美文网首页
抽奖业务中随机数改进

抽奖业务中随机数改进

作者: Teech | 来源:发表于2020-02-17 18:57 被阅读0次

在很多业务中,都会使用随机数,尤其很多抽奖类业务,总希望产生“质量”较高的随机序列,大部分都是使用启动时间戳作为一个随机数种子,使用C库自带的伪随机算法。

  • 随机算法
    很多自带的随机算法本身就是一个线性同余算法,有加法和乘法所以效率很高。
    线性同余的状态转移方程为f(n+1) = (a * f(n) + c) % m,其中最初设置的种子为f(0)。其实a,c,m常数直接影响随机数的质量。
    但是随机数要求除了要求得到统计上的均匀分布外,还有其他要求,比如不能根据已经存在的序列推测将来的序列。但是目前的伪随机算法都有一定的周期性,看线性同余的代码就可以直觉上感觉到有周期性,因为有个取余操作。

    下面上2张图来对比下不同的随机算法的质量。 1.jpg
2.jpg

这个可以很直观的感觉到图2中的随机质量很差,周期很明显。所以glibc或者一些语言自带的随机算法不能满足对随机数要求较高的场景,尤其是抽奖类业务。所以推荐一些质量更高的伪随机算法,常见的比如梅森旋转算法,WELL算法。

  • 伪随机种子
    大部分业务在在伪随机算法开始通过当前的时间戳来设置种子,这种做法及其容易被推测。之前我看过杭州小汽车摇号的视频,伪随机的种子都是通过气球去摇号码的来保证种子的真随机性。如何在代码中获取真随机数呢,intel的cpu提供指令RDSEED来获取,值是由芯片上的熵池初始化的,这个就提供了一个和摇号类似的真随机数种子了,但是为什么不是每个随机数都是通过真随机来获取呢,因为通过获取硬件的熵池的数据办法效率很低,一般只用作初始化伪随机算法来使用。以前看过一些代码在整个随机过程中,随便多次设置种子(为了防止别人推测种子)这个是个不对的做法,因为多次设置种子后可能导致整个序列都不会在统计上符合均匀分布了,所以种子只能设置一次。

通过对伪随机算法的改进以及随机种子的设置改善,可以大大提高随机数的安全性。

相关文章

  • 抽奖业务中随机数改进

    在很多业务中,都会使用随机数,尤其很多抽奖类业务,总希望产生“质量”较高的随机序列,大部分都是使用启动时间戳作为一...

  • 卢小宥家微信抽奖规则

    每轮组团10人即可开团抽奖。 工作人员随机从抽奖箱抓出一把抽奖卷,放桌子上,然后随机数18张抽奖卷放入3个标有1....

  • 随机数

    [toc] 我们应用中的随机数 抽奖,大转盘 我们经常接触的验证码 密码找回 go中select的公平保证 再然后...

  • Linux Shell 生成随机数和随机字符串

    日常生活中,会经常用到随机数,使用场景非常广泛,例如买彩票、丢骰子、抽签、年会抽奖等。 Shell 下如何生成随机...

  • java 生成 6 位的随机数

    在写业务的时候,有时要使用随机数,现总结了几种写随机数的方法如下:

  • 抽奖》抽奖

    #作业要求: 1.登录成功后,用户选择幸运抽奖菜单,进入幸运抽奖功能 2.输入会员卡号,系统生成5个4位随机数作为...

  • lua从随机数开始

    随机数的应用频率很高,很多地方都有可能会有到随机数,比如某商业广场促销活动里的抽奖...或者说那种飞行棋里随机行走...

  • 2020-10-28 代码改进

    代码改进方向 1 可读性改进 2 逻辑改进逻辑改进 两个方向开发效率改进,运行效率改进1 算法改进 看情况2 业务...

  • 昨日转发抽奖结果

    昨天大家帮忙转发抽奖结果粗来啦(李大猫写了一个随机数生成器抽奖 谢谢大家的转发支持,么么么么么么哒 我们以后会多多...

  • 异创手环概要设计

    一、通讯业务概要 1 手环连接 手机生成随机数,每次与手环进行连接,发送随机数给手环,如果手环没有被绑定,手环存下...

网友评论

      本文标题:抽奖业务中随机数改进

      本文链接:https://www.haomeiwen.com/subject/nlbffhtx.html