,和等无理数在小数点后具有唯一且不可重复的序列。如果我们从这样的数字中提取第个数字(其中是调用该方法的次数),并按原样制作一个数字,我们是否不应该得到一个完美的随机数生成器?例如,如果我们使用,和,则第一个数字是123,第二个数字是471,下一个数字是184,依此类推。
,和等无理数在小数点后具有唯一且不可重复的序列。如果我们从这样的数字中提取第个数字(其中是调用该方法的次数),并按原样制作一个数字,我们是否不应该得到一个完美的随机数生成器?例如,如果我们使用,和,则第一个数字是123,第二个数字是471,下一个数字是184,依此类推。
Answers:
最明显的缺点是基于无理数的PRNG算法不必要的复杂性。与LCG相比,它们需要为每个生成的数字进行更多的计算。而且这种复杂性通常会随着您按顺序进行的进一步增加。在1000台计算机上(以2010年为准),以十分之二的位数计算256位π花费了23天的时间-对于RNG来说,这是一个相当高的复杂性。
对于完美的任何合理定义,您描述的机制都不是完美的随机数生成器。
不重复是不够的。十进制数是不可重复的,但是它是一个可怕的随机数生成器,因为答案是“总是”为零,偶尔是一个,再没有别的了。
我们实际上不知道每个数字是否在或 的十进制扩展中是否同样出现(尽管我们怀疑它们确实如此)。
在许多情况下,我们要求随机数不可预测(实际上,如果您问随机人“随机”是什么意思,他们可能会说出不可预测性)。众所周知的常数的数字是完全可以预测的。
我们通常希望相当快地生成随机数,但是生成数学常数的连续数字往往非常昂贵。
但是,确实是和 的数字在统计上看起来是随机的,从某种意义上来说,每个可能的数字序列似乎都应该以应该出现的频率出现。因此,例如,每个数字确实十分接近十分之一。每个两位数序列非常接近一百分之一,依此类推。
从密码学上讲,它是无用的,因为对手可以预测每个数字。这也是非常耗时的。
/dev/random
,/dev/urandom
则总是有人会打开密码。
(更新后,许多人指出,随机数生成器是不一样的事,作为一个单一的正常序列)
如果您问是否可以从得到正常序列(即所有数字都统一出现),那么mathoverflow上有几个答案。例如,有关Pi的数字分布的答案是:
...它被认为的是是一个正常数(〜每个数字序列的均匀分布)。
有关数字分配数据,请参见例如http://www.eveandersson.com/pi/precalculated-frequencies或https://thestarman.pcministry.com/math/pi/RandPI.html(前1000个数字):
在mathoverflow上,还有以下不错的答案:
通常,这种方法不起作用:“随机性”并不意味着您会得到很多不同的数字,但还有其他方面。例如,经典测试是查看所有两位或三位等组合是否以相同的频率出现。这将是一个非常简单的测试,可以排除明显的非随机结果,但到目前为止仍然过于简单,无法检查真正的随机行为。
请参阅有关随机性测试的Wikipedia页面,作为与此相关的主要来源的链接的集合。他们确实提到了很多听起来很复杂的概念。对此进行深入讨论不是很重要-但很显然,直觉上不可能声明一个特定数字作为此类数字的良好来源。
积极一点:对于特定的非理性数字,您当然可以随意尝试;即,将数字计算为足够大的数字,然后通过所有已知的测试来运行它(有用于此目的的工具,请参见上面的链接)。如果该措施是不够好为您的使用情况下,如果你都知道,这是密码学应用显然没用,总是得到相同的数字,如果你要从头开始,而且如果你过去的质量可能会降低n
你选为了测试随机性,您可以使用这些数字。但是使用专用的(伪)随机数生成器会更好。没有什么能击败良好的物理随机性来源。
与许多伪随机数一样,它提供了一个好的随机数,直到您意识到它是如何产生的为止。您选择的无理数(非代数和非先验)是很普遍的,因此比其他人更容易猜测。如果您选择不常见的生成器,则我看不到此方法有任何问题。