1

我正在制作一个基本的编码算法,它接受输入,对其进行编码(使用随机数),然后解密。数组用“char”类型填充。它单独加密每个字母。我如何检查它在编码字母时是否没有将相同的字母编码为其他字母。

例子

编码

美国广播公司

a 被赋予随机数 2 b 被赋予随机数 5 我如何防止 c 被赋予 2 或 5

非常感谢!

4

2 回答 2

0

Baz 的答案会起作用,但会很慢(相对而言,因为您需要为每个生成的数字搜索集合,但您可能不在乎)。

Christoffer Hammarström(生成 N 个连续数字并随机播放)的答案有效,但缺乏随机性,因为这是用于加密的。

这是一种获取唯一(几乎)随机数数组的算法。

  1. 确定您需要能够编码多少个不同的字符 (caracterSetCount)
  2. caracterSetCount分配一个大小为 int 的数组
  3. 生成随机数以供以后使用:

静态最终 int RANDOM_RANGE = 3000;

randomKeys = new long[caracterSetCount];
randomKeys[0] = rand.nextInt(RANDOM_RANGE); // A number between 0 and RANDOM_RANGE 
for (int i=1; i<caracterSetCount; ++i) {
  randomKeys[i] = randomKeys[i-1] + 1 + rand.nextInt(RANDOM_RANGE); 
  We have a pseudo random number which is strictly greater than the previous one
}
  1. 如果需要,您可以打乱该列表(按顺序排列,您可能需要改进)

然后,您有一个数组来获取每个要编码的字符的伪随机数。

为了获得更多随机性,您可以增加 RANDOM_RANGE (但请注意不要在不断添加数字时溢出);

于 2012-10-05T12:30:09.733 回答
0

这是我的提议:

    Character yourInput[] = {'a', 'b', 'c', 'd'};
    int yourInputEncoded[] = new int[yourInput.length];
    Hashtable<Character, Integer> charToInt = new Hashtable<Character, Integer>();
    ArrayList<Integer> alreadyUsedInt = new ArrayList<Integer>();
    Random randomize = new Random();
    for(int i = 0; i < yourInput.length; i++)
    {
        if(!charToInt.containsKey(yourInput[i]))
        {
            int randomInt = randomize.nextInt();
            while(!alreadyUsedInt.contains(randomInt))
                randomInt = randomize.nextInt();

            charToInt.put(yourInput[i], randomInt);
            alreadyUsedInt.add(randomInt);
        }
        yourInputEncoded[i] = charToInt.get(yourInput[i]);
    }

对于每个 char,我们检查是否与 int 相关联。如果不是,我们(随机)生成一个新的关联 int(以前从未使用过)。之后,我们用他关联的 int 替换 char。那它:)

于 2012-10-05T12:29:24.020 回答