随机字符串检测

时间:2011-02-21 10:06:48

标签: java algorithm

我需要检查一个字符串是否相当随机而不进行频率分析,因为它太费时间了。那里有这样的算法吗?我用java构建它,但算法的一般描述也非常有用。

澄清: 对于人眼来说,以下文字在某种程度上是随机的...... dsfsddsfdsfsddsfs ....甚至是po340-3gk30g3gkf; glkp。

我不想确定它是多么随机。我只是想检测,就像一个人的方式,如果一个字符串是随机的,而不是测量它的实际随机性。

3 个答案:

答案 0 :(得分:7)

  

我需要检查一个字符串是否相当随机而不进行频率分析,因为它太耗费时间。

简单的频率分析基本上是我能想象到的最快的事情。您只需遍历字符串中的字符(一次)并跟踪计数。

我无法想象你能找到比这更快的“随机性测试”。

此外,我不能说你的问题很明确。从技术上讲,任何字符串都是随机的。如果你看起来像是“看起来”随机,我想你需要寻找各种各样的模式,这对你来说肯定太费时了。

您认为这是随机的吗?

String str = "                      o         _        _            _        "
           + "           _o        /\_      _ \\o     (_)\__/o     (_)       "
           + "         _< \_      _>(_)    (_)/<_       \_| \      _|/' \/   "
           + "        (_)>(_)    (_)           (_)      (_)       (_)'  _\o_ ";

对我来说看起来非常随意,但我很难定义看起来随机的内容。

答案 1 :(得分:5)

压缩后测量字符串的长度。 gzip即可。

所有压缩器都通过查找输入中的冗余来工作。重复子串是一种冗余形式,对应于对非随机性的常见直观和数学理解。 gzip及其同类产品专门寻找重复的子串,并将较短的“指针”替换为原始的第二次和后续事件。

压缩字符串的长度给出了Kolmogorov complexity的上限,这在某种意义上是“绝对随机性”,但无法直接测量。

虽然gzip和其他通用压缩器通常会生成一个标头,但短字符串可能看起来实际上长度增长(即通常不是length(a short string) < length(compress(a short string))的情况),它仍然是真的通常是length(compress(a short repetitive string)) < length(compress(a short non-repetitive string)),希望你能得到它。

答案 2 :(得分:0)

您可以以某种方式分析生成字符串的算法,也可以进行频率分析。但我相信没有办法确定String是否相当随机。

'13530168 = dwninwebvp'相当随机吗?