0

需要用shotgnhillclimbing方法解决playfair代码,想简单地先生成随机密钥,然后通过英文字母对频率计算分数。

但我不知道如何产生不重复的随机密钥,它是 25!可能性。所以如果我永远使用while,我找到正确密钥的可能性非常小。

我怎样才能生成一个密钥,然后要求编译器不要再次使用它?我使用列表:添加还是删除?或者还有别的吗?或者可能是一个字符串[25!]?

4

1 回答 1

1

通常的方法是从一个随机密钥开始,然后在每一步修改它。您可以执行的修改包括:交换两个关键字母、交换两个整行、交换两个整列、围绕中间列反射、围绕中间行反射或围绕两个主要对角线之一反射。在每个步骤中,您都会随机选择一种修改类型和修改位置。

您的随机选择可能对密钥矩阵没有影响。例如,如果您选择交换两行,并为交换的两个操作数选择相同的两行,则键矩阵将保持不变。没关系。两个连续的操作也可能会相互反转,从而将键矩阵返回到其先前状态。那也很好。因为每个决定都是随机做出的,一些改进了关键矩阵,一些使情况变得更糟,你的爬山算法会很好地工作(尽管它可能比必要的多一些步骤)。

关键是重复随机密钥的概率相当低,如果它确实发生并不重要。

于 2012-04-07T15:31:25.603 回答