入力を受け取り、それを (乱数を使用して) コーディングし、復号化する基本的なコーディング アルゴリズムを作成しています。配列は「char」型で埋められます。各文字を個別に暗号化します。文字をコーディングしているときに、同じ文字が別のものとしてエンコードされていないことを確認するにはどうすればよいですか。
例
エンコーディング
abc
a には乱数 2 が与えられます b には乱数 5 が与えられます c に 2 または 5 が与えられないようにするにはどうすればよいですか
どうもありがとう!
入力を受け取り、それを (乱数を使用して) コーディングし、復号化する基本的なコーディング アルゴリズムを作成しています。配列は「char」型で埋められます。各文字を個別に暗号化します。文字をコーディングしているときに、同じ文字が別のものとしてエンコードされていないことを確認するにはどうすればよいですか。
例
エンコーディング
abc
a には乱数 2 が与えられます b には乱数 5 が与えられます c に 2 または 5 が与えられないようにするにはどうすればよいですか
どうもありがとう!
これが私の提案です:
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]);
}
各文字について、int に関連付けられているかどうかを確認します。そうでない場合は、関連付けられた新しい int (これまで使用されたことがない) を (ランダムに) 生成します。その後、char を関連する int に置き換えます。そのこと :)
Bazの答えは機能しますが、遅くなります(比較的言えば、生成された数値ごとにセットを検索する必要がありますが、気にしないかもしれません)。
Christoffer Hammarström からの回答 (N 個の連続した数字を生成してシャッフルする) は機能しますが、これは暗号化のためであるため、ランダム性が欠けています。
これは、一意の (ほぼ) 乱数の配列を取得するアルゴリズムです。
caracterSetCountサイズの int 配列を割り当てますstatic final 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 を増やすことができます (ただし、数値を追加し続けるときにオーバーフローしないように注意してください)。