-
Notifications
You must be signed in to change notification settings - Fork 0
random
Xiaolin Zhang edited this page Nov 2, 2019
·
1 revision
一段神奇的算法 再看随机数发生器算法, 找到了taocp老爷子写的一个版本, 又找到了当年贝尔实验室的两位研究员(DP Mitchell and JA Reeds)用类似的思路在plan 9里留下一段代码, 结果几十年后又被Golang继承过来用(和C的代码简直一模一样). 跨越了几十年, 一段代码从一个语言复制到另一个语言. 只有当年作者的名字, 没有算法的名字.神奇神奇.
一段神奇的go代码
翻看math/rand下的代码, 和主流的随机数发生器都不一样. 翻看了半天只搜到其作者是(DP Mitchell and JA Reeds), 本以为他们是Go语言的贡献者, 没想到这段代码几乎是原封不动从Plan 9的代码里抄来的.其作者自然是来自贝尔实验室. 而这段算法核心思想和taocp里老爷子讲述的随机原理很像.也不知道他们是不是认识.
go有两个生成随机数的官方包. 一个是math/rand, 一个是crpto/rand, 后一个是一个密码学安全的加密方法. 他实际上是调用体统提供的接口.或者类似于/dev/rand这种物理真随机数.所谓密码学安全特指没人能爆破才出来序列.
math下的方法不是说不安全, 不好用, 而是他本质上是伪随机数.尤其是种子如果设置的比较随意.其实会遭受到爆破攻击.
美国国家标准技术研究所 开源了一套东西, NIST 随机数测试
.可以针对其SP800标准进行检测. 使用很方便. 将一个只包含0/1的文本传进去, 他会使用多个检验方法对结果进行检验.