我正在制作一个基本的编码算法,它接受输入,对其进行编码(使用随机数),然后解密。数组用“char”类型填充。它单独加密每个字母。我如何检查它在编码字母时是否没有将相同的字母编码为其他字母。
例子
编码
美国广播公司
a 被赋予随机数 2 b 被赋予随机数 5 我如何防止 c 被赋予 2 或 5
非常感谢!
我正在制作一个基本的编码算法,它接受输入,对其进行编码(使用随机数),然后解密。数组用“char”类型填充。它单独加密每个字母。我如何检查它在编码字母时是否没有将相同的字母编码为其他字母。
例子
编码
美国广播公司
a 被赋予随机数 2 b 被赋予随机数 5 我如何防止 c 被赋予 2 或 5
非常感谢!
Baz 的答案会起作用,但会很慢(相对而言,因为您需要为每个生成的数字搜索集合,但您可能不在乎)。
Christoffer Hammarström(生成 N 个连续数字并随机播放)的答案有效,但缺乏随机性,因为这是用于加密的。
这是一种获取唯一(几乎)随机数数组的算法。
caracterSetCount
分配一个大小为 int 的数组静态最终 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
}
然后,您有一个数组来获取每个要编码的字符的伪随机数。
为了获得更多随机性,您可以增加 RANDOM_RANGE (但请注意不要在不断添加数字时溢出);
这是我的提议:
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。那它:)