伪随机数生成器(PRNG)是非常复杂的野兽。
没有真正的“完美”随机数生成器-实际上,可以通过数学函数完成的最好的操作是伪随机数-对于大多数意图和目的,它们似乎足够随机。
实际上,从PRNG返回的数字中执行任何其他操作并不会真正增加其随机性,并且实际上,数字的随机性会降低。
因此,我最好的建议是,不要弄乱PRNG返回的值。使用足以满足预期用途的PRNG,如果不是,则在必要时找到可以产生更好结果的PRNG。
坦率地说,该
mt_rand函数似乎使用了Mersennetwister,它实际上是一个非常不错的PRNG,因此对于大多数临时使用来说可能已经足够好了。
但是, Mersenne Twister并非旨在用于任何安全上下文。
编辑
评论中有一个问题,为什么对随机数执行运算可以使随机性降低。例如,某些PRNG可以在比特的不同部分返回更一致,更少的随机数-高端可能比低端更多。
因此,在丢弃高端并返回低端的操作中,该值的随机性可能小于从PRNG返回的原始值。
目前,我找不到很好的解释,但是我基于Java文档中的
Random.nextInt(int)方法进行了解释,该方法旨在在指定范围内创建一个相当随机的值。该方法考虑了值各部分的随机性差异,因此与诸如的更幼稚的实现相比,它可以返回更好的随机数
rand()% range。



