Bazの答えは機能しますが、遅くなります(比較的言えば、生成された数値ごとにセットを検索する必要がありますが、気にしないかもしれません)。
Christoffer Hammarström からの回答 (N 個の連続した数字を生成してシャッフルする) は機能しますが、これは暗号化のためであるため、ランダム性が欠けています。
これは、一意の (ほぼ) 乱数の配列を取得するアルゴリズムです。
- エンコードできるようにするために必要な異なる文字の数を決定します (caracterSetCount)
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 を増やすことができます (ただし、数値を追加し続けるときにオーバーフローしないように注意してください)。