我需要使用以下属性生成随机结果:
该应用程序涉及金钱,因此结果保持不可预测并且统一分布至关重要。
常规伪随机生成器是否适合这项工作,还是需要加密强大的rng? Ruby的默认rand()是否有效?有什么需要注意的吗?
如果没有,你会建议什么解决方案?
编辑: Ruby 2.0.0随机http://www.ruby-doc.org/core-2.0.0/Random.html
答案 0 :(得分:2)
Ruby的默认rand使用Mersenne Twister算法。 PRNG的内部状态,虽然规模适中,而且简单无法入侵,但理论上足够小,只有几十个值从1到10就足以确定其状态,因此您的担忧并非没有根据。 (更新:显然内部状态也“泄漏”到返回的值中,使黑客攻击变得更容易)
我建议你使用SecureRandom,因为它通常使用/dev/urandom
或open-ssl库作为随机原始来源。其中一个可能在您的目标服务器上可用,并且不需要其他硬件或专业库。
您可能希望进一步研究从外部源收集熵的模块,然后使用加密散列算法将其混合(以获得均值的位值分布)。 Ruby gem RealRand连接到一些做这类事情的服务。我在Ruby中找不到更现代的东西。
如果您担心信任第三方服务,并且有时间编写自己的Ruby包装器,您还可以查看一个可以通过电子噪音工作的USB设备like this one。