在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
0x00 摘要本文是开发中的简略记录,具体涉及知识点有:Lua,随机数。 0x01 背景Lua语言生成随机数需要用到两个函数:
0x02 问题2.1 Lua随机数函数问题Lua语言的随机数函数存在问题:
原因是LUA的random只是封装了C的rand函数,使得random函数有一定的缺陷, 2.2 C语言随机数函数问题其实计算机产生的随机数都是依照事先写好的算法执行出来的,行为是可以预测的,所以计算机产生的随机数都不是真正意义上的随机数,只是伪随机数,是以一个真值(也称为种子)为初始条件,然后用一定的算法不停迭代产生随机数。 C语言 rand的内部是用线性同余法做的,因为其周期特别长,所以在一定范围内可以看成是随机的。 线性同余方法(LCG)是一种产生伪随机数的方法。它是根据递归公式实现:
线性同余法最重要的是定义了三个整数,乘数 A、增量 B和模数 M,其中A, B, M是产生器设定的常数。 LCG的周期最大为 M,但大部分情况都会少于M。要令LCG达到最大周期,应符合以下条件:
0x03 解决方案问题的解决方案就是:让用户使用randomseed先设一个随机种子。比如在服务器启动的时候设置一个随机种子,让系统产生的随机序列不相同。 3.1 移位轮转 + 线性同余一种常见的办法是以 time 函数返回的秒数为基准。但是因为如果需要短期内频繁使用随机数,这个方法不可行,因为容易产生类似数字,所以就把 time返回的数值字串倒过来(低位变高位), 再取高位几位。这样即使 time变化很小, 但是因为低位变了高位, 种子数值变化却很大,就可以使伪随机序列生成的更好一些。 这其实是一种 “移位轮转“ 的思想。
3.2 Linux随机种子在linux下,我们可以使用 /dev/random以及/dev/urandom产生随机种子。 其原理是利用当前系统的熵池来计算出一定数量的随机比特,其中熵池是根据当前系统的“环境噪音”,它是由很多参数共同评估的,如内存的使用,文件使用量等等,环境噪音直接影响着所产生的随机种子的有效性。 /dev/random与/dev/urandom之间存在区别:
对于我们来说,需要阻塞总是不好的,因此 urandom 更加理想。 3.3 移位轮转 + 线性同余 + Linux随机种子我们可以采用的是在之前办法上,加入Linux随机种子,代码如下:
当然也可以再结合起来设置
0xFF 参考 |
请发表评论