Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将随机字节缩放到选定的整数范围_Java_File_Random_Numbers - Fatal编程技术网

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

Java 将随机字节缩放到选定的整数范围,java,file,random,numbers,Java,File,Random,Numbers,我有一个真正随机字节的文件。我想要一个函数,通过从文件中提取一个字节并缩放它,返回给定范围内的随机整数。(这个词对吗?) public int getInt(int l,int h)抛出IOException{ int m=(h-l)+1;//需要的范围数 int r=256/m;//字节范围的大小 int x=(r*m)-1;//允许的最大字节值 int b; 做{ 尝试{//从文件中获取随机字节 b=ram.readUnsignedByte(); }catch(EOFEException e

我有一个真正随机字节的文件。我想要一个函数,通过从文件中提取一个字节并缩放它,返回给定范围内的随机整数。(这个词对吗?)

public int getInt(int l,int h)抛出IOException{
int m=(h-l)+1;//需要的范围数
int r=256/m;//字节范围的大小
int x=(r*m)-1;//允许的最大字节值
int b;
做{
尝试{//从文件中获取随机字节
b=ram.readUnsignedByte();
}catch(EOFEException e){//catch EOF,重置指针
b=255;ram.seek(0);//并将b设置为最大值
}//所以测试将失败。
}while(b>x);//如果字节大于
//允许值,循环。
return(b/r)+l;//返回随机整数
}//在请求的范围内
这是我的函数。我担心通过缩放来破坏文件中字节的真正随机性。我读到我需要扔掉任何超过允许的最大值的数字(因此对于数字0-9,最大值是249,因为我只剩下7个值可以分配给10个不同的组)。我的实现看起来正确吗


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

是的,为了避免偏差,不能使用模,必须抛出不在范围内的结果

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

  • 添加一个函数以计算存储给定数字需要多少位
  • 添加一个类,该类读取并缓冲随机性文件中的字节,并有方法为您提供一个整数,其中包含从该文件中获取的一些位数(剩余的位数为0)
  • 添加获取随机数的实际方法:
    • 计算结果的范围,并从中计算所需的位数
    • 循环获取位,添加下限,如果结果大于上限,则重试
  • 请注意第2步:第一个实现可能非常粗糙,例如,您可以只获取4个字节作为整数,并抛出额外的位。稍后,您可以优化该类以保留未使用的位,并在下次使用它们,以避免浪费随机位。由于获得真正好的随机位通常有点昂贵,因此这种优化可能值得认真使用

    有关位操作,请参见此问题的示例:

    抱歉,您错过了提供的范围。必须消失,所以我删除了我的答案,因为它不能处理范围。没关系,我喜欢你的想法,读取更多字节,然后将它们移动到更大的值。稍后我可能会用到它,但我只是想确保这个基本实现不会破坏文件的任何随机性。因此,您可以安全地读取4个字节,并将它们视为一个有符号的int。我并不是试图将4个字节的块视为int,而是使用单个字节在传递给函数(
    int l,int h
    )@user1684045的范围内生成一个随机数,这很清楚:因此,您只需要取一个字节,然后在这些值之间缩放它,创建“差距“如果
    h-l>255
    ?好主意,关于如何保留未使用的位有什么建议吗?没有时间编写完整的示例代码,但最简单的方法是添加成员变量
    int lastReadByte
    int-usedbitslinlastreadbyteint unusedBits=8-this.usedbitslinlastreadbyte然后rest只是位操作,当使用当前字节中的所有8个字节时,读取下一个字节,请参阅我添加到答案本身的链接。