Ruby的rand()是否适合赌博游戏?

时间:2013-11-18 12:21:52

标签: ruby random

我需要使用以下属性生成随机结果:

  • 统一分布(即数字1-10同样可能)
  • 不可预测(所有结果都是公开的,如果是数据,仍然无法预测结果)

该应用程序涉及金钱,因此结果保持不可预测并且统一分布至关重要。

常规伪随机生成器是否适合这项工作,还是需要加密强大的rng? Ruby的默认rand()是否有效?有什么需要注意的吗?

如果没有,你会建议什么解决方案?

编辑: Ruby 2.0.0随机http://www.ruby-doc.org/core-2.0.0/Random.html

1 个答案:

答案 0 :(得分:2)

Ruby的默认rand使用Mersenne Twister算法。 PRNG的内部状态,虽然规模适中,而且简单无法入侵,但理论上足够小,只有几十个值从1到10就足以确定其状态,因此您的担忧并非没有根据。 (更新:显然内部状态也“泄漏”到返回的值中,使黑客攻击变得更容易)

我建议你使用SecureRandom,因为它通常使用/dev/urandom或open-ssl库作为随机原始来源。其中一个可能在您的目标服务器上可用,并且不需要其他硬件或专业库。


您可能希望进一步研究从外部源收集熵的模块,然后使用加密散列算法将其混合(以获得均值的位值分布)。 Ruby gem RealRand连接到一些做这类事情的服务。我在Ruby中找不到更现代的东西。

如果您担心信任第三方服务,并且有时间编写自己的Ruby包装器,您还可以查看一个可以通过电子噪音工作的USB设备like this one