将随机字节缩放到选定的整数范围

我有一个真随机字节的文件。 我想要一个函数,它返回一个随机整数,该范围是从文件中取一个字节并对其进行缩放。 (这是正确的词吗?)

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 

所以这是我的function。 我担心通过缩放来破坏文件中字节的真正随机性。 我读到我需要丢弃任何超过允许最大值的数字(因此对于数字0-9,最大值是249,因为我只剩下7个值分配给10个不同的组)。 我的实施看起来是否正确?

另外,我想知道,只是通过使某些太大的字节无效,我是否以任何方式扭曲了分布?

是的,为了避免偏见,你不能使用modulo,你必须抛弃不在范围内的结果。

成功编程的关键是将您的任务分配到合适的子任务中。 快速规格:

  1. 添加一个函数来计算存储给定数字所需的位数
  2. 添加一个从随机文件中读取和缓冲字节的类,并且有一个方法可以为您提供一个整数,该整数具有从文件中取出的一些位数(其余的位0)。
  3. 添加实际方法来获取随机数:
    • 计算结果的范围,并从中计算所需的位数
    • 循环获取位,添加下限,如果结果超过上限则重试

关于第2步的注意事项:第一个实现可能非常粗糙,例如,您可以将4个字节作为整数并丢弃额外的位。 稍后您可以优化此类以保留未使用的位并在下次使用它们,以避免浪费随机位。 由于获得真正好的随机位通常有些昂贵,因此这种优化可能值得认真使用。

对于位操作,请参阅例如这个问题: Java“Bit Shifting”教程?