我想出了两种方法来生成相对较短的随机字符串 - 一种更快更简单,另一种更慢但我认为更随机。是否有一种非超级复杂的方法或方法来衡量每个方法的数据 随机性如何?
我已经尝试压缩输出字符串(通过zlib),确定数据越真实随机,压缩的次数就越少,但事实证明并不多。
答案 0 :(得分:9)
您正在使用标准压缩作为不可计算Kolmogorov Complexity的代理,这是用于量化随机性的“正确”数学框架(但遗憾的是,这是不可计算的)。
如果您愿意对字符串进行某种分配,您也可以尝试一些entropy的度量。
答案 1 :(得分:0)
您可以使用某些映射将字符串转换为数字,然后应用Diehard
和TestU01
等标准测试。请注意,需要很长的样本序列(通常只有几MB文件)
答案 2 :(得分:0)
如果不能确定地提前预测结果,则该结果被认为是随机的。如果可以肯定地预测它被认为是确定性的。这是二元分类,结果要么是确定性的,要么是随机的,没有随机性程度。但是,有一定程度的可预测性。如EMS所述,可预测性的一个衡量标准是熵。
考虑两场比赛。你不知道在任何一场比赛中你是否会赢或输。在第一场比赛中,获胜的概率是1/2,即从长远来看,你赢了大约一半的时间。在第2场比赛中,获胜的几率是1/100。这两种游戏都被认为是随机的,因为结果并不是确定无疑的。游戏1具有比游戏2更大的熵,因为结果不太可预测 - 虽然有获胜的机会,但你很确定在任何特定的试验中你都会输掉。
对于一系列值,可以实现的压缩量(通过良好的压缩算法)与序列的熵有关。英语的熵很低(在字母的相对频率和作为组出现的单词序列中都有大量冗余信息),因此往往压缩得很好。