1

入力を受け取り、それを (乱数を使用して) コーディングし、復号化する基本的なコーディング アルゴリズムを作成しています。配列は「char」型で埋められます。各文字を個別に暗号化します。文字をコーディングしているときに、同じ文字が別のものとしてエンコードされていないことを確認するにはどうすればよいですか。

エンコーディング

abc

a には乱数 2 が与えられます b には乱数 5 が与えられます c に 2 または 5 が与えられないようにするにはどうすればよいですか

どうもありがとう!

4

2 に答える 2

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]);
    }

各文字について、int に関連付けられているかどうかを確認します。そうでない場合は、関連付けられた新しい int (これまで使用されたことがない) を (ランダムに) 生成します。その後、char を関連する int に置き換えます。そのこと :)

于 2012-10-05T12:29:24.020 に答える
0

Bazの答えは機能しますが、遅くなります(比較的言えば、生成された数値ごとにセットを検索する必要がありますが、気にしないかもしれません)。

Christoffer Hammarström からの回答 (N 個の連続した数字を生成してシャッフルする) は機能しますが、これは暗号化のためであるため、ランダム性が欠けています。

これは、一意の (ほぼ) 乱数の配列を取得するアルゴリズムです。

  1. エンコードできるようにするために必要な異なる文字の数を決定します (caracterSetCount)
  2. caracterSetCountサイズの int 配列を割り当てます
  3. 後で使用する乱数を生成します。

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
}
  1. 必要に応じて、そのリストをシャッフルできます (順序付けられているため、改善する必要がある場合があります)。

次に、エンコードする文字ごとに疑似乱数を取得するための配列があります。

ランダム性を高めるには、RANDOM_RANGE を増やすことができます (ただし、数値を追加し続けるときにオーバーフローしないように注意してください)。

于 2012-10-05T12:30:09.733 に答える