我正在制作一个需要随机化东西的小型Web应用程序。 只是它的一个小例子:向用户返回10和10之间的随机数。
我打算使用Javascript和jQuery(计算器本身)来完成它。
我的问题是:如何使其功能真正随机而非伪随机? PHP函数可能比Javascript更随机吗?
为了这个问题,让我们说我想要的是X和Y之间的真正随机数。
答案 0 :(得分:6)
您调用的任何功能都不会“真正随机”。它们都是PRNGs;事实上,大多数PRNG都非常好,如果它们不适合您的应用,我会感到惊讶。此外,虽然少数PRNG因其短暂的时期而臭名昭着(Java Random
浮现在脑海中),但我所知道的每一种现代语言 - 包括JavaScript,PHP和(及其加密包)Java都有非常好的PRNG
收集“更随机”数据的最佳方法是从外部随机源获取数据。一种可能性是要求用户在窗口中移动鼠标一段时间,定期收集鼠标坐标。一些军事,银行和其他高安全性系统使用热噪声传感器等硬件来获取尽可能接近随机的数据;但是,Web应用程序无法使用此类硬件支持。
请注意,使用系统时钟的黑客并不比PRNG好;大多数PRNG都会使用这些数据来初始化他们的种子。
答案 1 :(得分:4)
您还没有理解Matrix电影。 ;)一个函数不是“比其他语言更随机”。所有函数同样是伪随机。 “伪”意味着计算机无法根据定义从空中拉出随机数。它只是不能。计算机严格按照规则计算。系统中的任何地方都没有随机性。对于它所有的假设力量,随机性是计算机根本无法做到的一件事(那就是制作咖啡)。
对于真正的随机性,您需要一个外部的自然来源。就像测量原子衰变一样,或者一些不可预测且真正随机的东西。其他任何东西都只是伪随机性,可能质量不一。
好的PRNG试图在熵池中收集“外部干扰”;例如Linux'/dev/random
考虑了系统驱动程序“噪音”,这可能是基于点击以太网端口的“随机”数据包或用户的鼠标移动。 真正的随机是多么值得商榷,但至少在大多数情况下都是非常非常难以预测的
答案 2 :(得分:1)
我认为没有办法完全从程序中删除随机性的确定性方面。你可以做任何你想要的事情,尽量减少,减轻和混淆你用来“从帽子中提取数字”的任何过程,但你永远不能真正使它完全随机。
你可以制定一个具有足够细节的过程,使其几乎随机,但真正的随机可能是不可能的。
答案 3 :(得分:1)
虽然您无法使用php中的代码实现真正随机,但您可以使用random.org API。你可以通过php中的curl或javascript中的ajax连接。 据我所知,他们使用大气噪声作为随机种子。
答案 4 :(得分:1)
无法在计算机上生成真正的随机变量。但是,您可以改进标准生成器。假设您有两个基本生成器。您创建一个表并用第一个生成器的值填充它。然后,如果要获取数字,则第二个生成索引并从表中返回相应的值。然后用新的值替换这个值...我忘了这个发生器是如何调用的......希望,它有所帮助。 附:抱歉我的英文。
答案 5 :(得分:1)
我的建议是你通过加密算法加密本地时间和日期来生成二进制随机字符串。在这种情况下,尝试收集所有可能的“随机”数据源,并将它们作为输入消息和输入密钥加载。
正如您在上面的答案中所看到的,您对随机数据的使用和要求非常重要。如果您的应用程序很难或不可能提前猜测其值,则该数字是“随机的”。请注意,对于某些应用程序,相同的数字源可能被认为是随机的,而在其他应用程显然,如果您需要高质量的随机数以满足苛刻的应用,您将遇到严重的问题。
TRNG98 True Random Numbers