以下是来自用户@David
的巴别图书馆的描述巴别图书馆网站(libraryofbabel.info)包含书籍 伪随机生成的文本,每个文本有410页,位于 图书馆的“地板”,“墙壁”和“架子”。任何序列都少 超过3200个字符(包括所有26个字母和句点,空格, 和逗号)可以在至少一本书中找到。
在网站上,您可以搜索字符串(最多3200个字符),该网站将返回3个结果: 1)只是一串文本本身,这是一个独特的页面 2)在随机字符中出现该字符串的任何地方 3)在实际英语单词的随机组合中出现该字符串的任何地方
令我难以理解 fast 搜索是怎样的。据推测,该网站实际上并不存储任何页面,它都是通过算法生成的(如果我错了,请纠正我)。如果是这样的话,几乎可以立即生成所有可能的组合,将它们分成随机字符,与英语单词相比,并告诉我字符串显示的页数是多少?即使有一些统计手淫,如果它告诉我有78482018页面符合我的查询,它更多的是估计,它仍然会立即返回20页。不认真。 右。程。
怎么这么快?
答案 0 :(得分:1)
注意:这是一种数学答案
巴贝尔图书馆实际上并不存储任何东西,这意味着存储29 ^ 3200本书。
首先,我将首先解释伪随机函数是什么。一个好的伪随机函数会生成一个似乎是随机的数字序列,但是可以在给定足够信息的情况下进行预测。
以功能
为例f(x)= x ^ 2 + c mod n,其中c和n是常数
如果我们从x = 2,c = 1和n = 20开始,通过重复将f(x)应用于前一个结果(迭代f(x)),我们将得到序列
2,5,6,17,10,1,2 ......并且循环重新开始...
因此,如果我们知道c,n和x的起始值(称为种子),则可以轻松预测以下数字。例如,使用6的种子,您可以预测后面的数字将是17,10和1.如果您想记住序列17,10,1,您只需要记住种子(17),和序列的长度(3)。
如果要枚举由Babel库使用的函数生成的完整序列,直到它循环回第一个数字,最终会得到一个包含所有*可能的3200个字符子串的字符串。要查找子字符串,只需要种子。
最后一招是找到一个可逆的函数,这意味着给定一个[sub]序列,可以找到种子。许多伪随机函数可以不费力地进行逆向工程,但在巴别图书馆的情况下,需要花费一些精力。
*几乎所有