我需要检查一个字符串是否相当随机而不进行频率分析,因为它太费时间了。那里有这样的算法吗?我用java构建它,但算法的一般描述也非常有用。
澄清: 对于人眼来说,以下文字在某种程度上是随机的...... dsfsddsfdsfsddsfs ....甚至是po340-3gk30g3gkf; glkp。
我不想确定它是多么随机。我只是想检测,就像一个人的方式,如果一个字符串是随机的,而不是测量它的实际随机性。
答案 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'相当随机吗?