Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.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 获取范围(x,y)内的随机BigInteger_Java_Random_Range_Biginteger - Fatal编程技术网

Java 获取范围(x,y)内的随机BigInteger

Java 获取范围(x,y)内的随机BigInteger,java,random,range,biginteger,Java,Random,Range,Biginteger,我需要得到一个大于2^511小于2^512的随机大整数。你可以试试 byte[] bytes = new byte[64]; // 512 bits new Random().nextBytes(bytes); bytes[0] |= 0x80; // set the most significant bit return new BigInteger(1, bytes); public static void main(String[] args) {

我需要得到一个大于2^511小于2^512的随机大整数。

你可以试试

byte[] bytes = new byte[64];    // 512 bits
new Random().nextBytes(bytes);
bytes[0] |= 0x80;               // set the most significant bit
return new BigInteger(1, bytes);
public static void main(String[] args) {
    int min = 511;
    double rand = Math.random(); //between 0 and 1
    double exp = min + rand; //between 511 et 512

    Double result = Math.pow(2, exp);

    System.out.println("result = ["+result+"]");

}
它可能没有被优化,但它是有效的。使用双精度结果,可以获得一个整数

从文档:

BigInteger(整数,随机数)

构造一个随机生成的BigInteger,均匀分布在0到(2numBits-1)的范围内,包括0到(2numBits-1)

因此,类似的方法应该有效:

    BigInteger number = new BigInteger(512, new Random()); //Give you a number between 0 and 2^512 - 1
    number = number.setBit(0); //Set the first bit so number is between 2^511 and 2^512 - 1

此解决方案首先创建一个值为2^511的BigInteger,然后添加一个介于0和2^511-1之间的值:

StringBuilder builder = new StringBuilder("1");
for (int bit = 0; bit < 511; bit++) builder.append("0");
BigInteger value = new BigInteger(builder.toString(), 2).add(new BigInteger(511, new Random()));
StringBuilder=新的StringBuilder(“1”);
对于(int bit=0;bit<511;bit++)builder.append(“0”);
BigInteger值=新的BigInteger(builder.toString(),2).add(新的BigInteger(511,新的Random());

这是一个示例代码,我想他想要的是均匀分布,而不是对数均匀分布。这里有2^511-1个介于2^511和2^512之间的整数,没有一个可以放入双变量中@JanDvorak未指定,可能是您right@okiharaherbst双精度
的最大值为2^1024。范围很好,即使精度还不够高。@JanDvorak当然(虽然从技术上讲,我说double并没有错——但我很乐意承认我太快发布了:)