一般来说,您是对随机数的常见误解的受害者:随机序列并不意味着数字不能在该序列中重复。恰恰相反,它的概率很高。这种错误信念实际上被用来区分人类生成的“随机”序列和真实序列。人类生成的 0 和 1 的“随机”序列可能如下所示:
0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, ....
而真正的随机序列并不羞于重复相同的数字两次以上:) 一个很好的例子是统计检验 http://en.wikipedia.org/wiki/Statistical_randomness#Tests还要寻找重复。
两种生成器都具有良好的“统计特性”
人们普遍错误地认为,加密安全的随机数会以某种方式产生“更加随机”的值。他们的统计概率可能非常相似,并且在这些标准统计测试中都会表现得非常好。
哪里用哪个
因此,这实际上取决于您想要做什么,您的选择是 PRNG 还是加密安全 PRNG (CSPRNG)。 “普通”PRNG 非常适合模拟目的,例如蒙特卡罗方法等。CSPRNG 的额外好处是不可预测性。因为 CSPRNG 可以“做得更多”,所以它的性能也很可能会比普通 PRNG 差。
可以看出,“安全”PRNG 的概念与预测其输出的下一位的能力紧密结合。对于 CSPRNG,随时预测其输出的下一位在计算上是不可行的。当然,只有当你将其种子价值视为秘密时,这才成立。一旦有人找到了种子,整个事情就变得很容易预测——只需重新计算 CSPRNG 算法已经生成的值,然后计算下一个值。还可以进一步证明,不受“下一位预测”影响实际上意味着没有任何统计测试可以区分 CSPRNG 的分布与真实随机均匀分布的分布。因此,PRNG 和 CSPRNG 之间还有另一个区别:虽然好的 PRNG 在许多统计测试中表现良好,但 CSPRNG 保证在以下方面表现良好:all tests.
经验法则是在哪里使用哪个
- 您在“敌对”环境中使用 CSPRNG,您不希望外部人员能够猜测敏感信息(会话 ID、赢/输真钱的在线扑克,......)
- 而 PRNG 在一个仁慈的环境中,你只需要良好的统计特性,但不关心可预测性(蒙特卡洛模拟、单人扑克与计算机、一般的计算机游戏)——即,无法赢得金钱或失去生命。如果有人能够成功预测这些随机数,就会失败。