前两天被人问了一个随机数产生算法,然后我当时没反应过来,愣住了。今天翻了下笔记整理了一下。因为 V 站 markdown 不支持公式,所以不贴公式了,自己搜索吧
一般来说怎么衡量随机数的随机性呢?考察两个方面:
目前常见的伪随机数产生器是线性同余算法,线性同余法也有很多变种,比方说使用离散对数 /大整数分解难题继续拓展
除了上面的常规随机数产生方法,还有基于加密算法的随机数算法。
BBS 产生器:这个的难度是基于大整数分解难题。
Rabin 产生器:k 是一个大于等于 2 的整数,在[2^k,2^{k+1}]之间选取两个奇素数,p,q,有 p=q=3(mod 4),利用这两个 p/q 进行计算
离散指数比特序列产生器
crypto++的随机数同样需要先 seed,而且不是线程安全的实现。
crypto++的随机数算法比较多:
RandomPool
is a PGP style random pool,实际上是 AES 加密算法Openssl 内部实现了足够安全的随机数产生器,使用的算法包括 NIST, ANSI X9 committee (X9.17 and X9.31)等算法。
默认情况下 openssl 使用 md5 作为随机数产生函数。一般情况下 openssl 使用 /dev/urandom 作为随机数产生器的种子源。设置好 seed 之后,可以通过软算方式获得产生的密钥。
如果你是 openssl1.0.1,使用的 cpu 是 i5/i7 三代 cpu 也可以使用硬件随机数产生器。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.