真のランダムバイトのファイルがあります。ファイルからバイトを取得してスケーリングすることにより、指定された範囲のランダムな整数を返す関数が必要です。(これは正しい言葉ですか?)
public int getInt(int l, int h) throws IOException {
int m = (h - l) + 1; // number of ranges needed
int r = 256 / m; // size of byte range
int x = (r * m) - 1; // maximum allowable byte value
int b;
do {
try { // get random byte from file
b = ram.readUnsignedByte();
} catch (EOFException e) { // catch EOF, reset pointer
b = 255; ram.seek(0); // and set b to maximum value
} // so test will fail.
} while(b > x); // if byte is greater than
// allowable value, loop.
return (b / r) + l; // return random integer
} // within requested range
これが私の機能です。ファイルをスケーリングして、ファイル内のバイトの真のランダム性を破壊することを心配しています。許可された最大値を超える数値を破棄する必要があることを読みました(したがって、数値0〜9の場合、10の異なるグループに配布する値が7つしかないため、最大値は249になります)。私の実装は正しいように見えますか?
また、大きすぎる特定のバイトを無効にするだけで、何らかの方法で分布を歪めているのではないかと思います。