Java的长度超过100000000

Java的长度超过100000000,java,Java,在这个简单的代码中,我不能长得超过100000000。长度是10个字符,我想比15个字符大 long value = nextLong(rand,1000000000); long nextLong(Random rng, long n) { long bits, val; do { bits = (rng.nextLong() << 1) >>> 1; val = bits % n; } while (bi

在这个简单的代码中,我不能长得超过
100000000
。长度是10个字符,我想比15个字符大

long value = nextLong(rand,1000000000);

long nextLong(Random rng, long n) {
    long bits, val;
    do {
        bits = (rng.nextLong() << 1) >>> 1;
        val = bits % n;
    } while (bits-val+(n-1) < 0L);
    return val;
}
long value=nextLong(兰特,100000000);
长下长(随机rng,长n){
长位,val;
做{
位=(rng.nextLong()>>1;
val=位%n;
}而(位val+(n-1)<0L);
返回val;
}

您应该能够使用BigInt

导入时使用:

import java.math.BigInteger;
声明如下:

BigInteger myBigInt = new BigInteger("123456789123456789");

您的
long
常量缺少
L
后缀:

long value = nextLong(rand,100000000000000L);
我想变得比15个字符更大

long value = nextLong(rand,1000000000);

long nextLong(Random rng, long n) {
    long bits, val;
    do {
        bits = (rng.nextLong() << 1) >>> 1;
        val = bits % n;
    } while (bits-val+(n-1) < 0L);
    return val;
}

Java的
long
的范围为–9223372036854775808到9223372036854775807(18个完整数字+0..8范围内的顶部数字),这足以覆盖需要覆盖的范围。如果需要19位或更多十进制数字,则需要使用
biginger

增加“n”的限制值。由于您通过执行模“n”来限制生成的随机值,显然生成的值需要小于“n”。因为您的限制是很长一段时间,您可以增加该限制,以允许在不进行其他更改的情况下获得15位数的结果


但是,我不确定下一个长函数中的循环要实现什么。它只会在位>(Long.MAX-n+1)时循环。

我感觉你在用自己的模运算限制自己

记住,模除法和短除法是一样的——我们在三年级时用过的那种。也就是说,我们不是除掉整数,而是取整部分和余数

所以,让我们举一个简单的例子(10的幂,因为你也使用一个):

也就是说,如果我用短除法将99除以10,我将能够将它平均除以9次,剩下9位。请注意,剩下的比我要除以的要短一个数量级

这将随着更高阶的除数而增大:

999 / 10 = 99 remainder 9
9999 / 10 = 999 remainder 9
99999 / 10 = 9999 remainder 9
…等等。请注意,我们的余数总是比股息低一个数量级。这是有道理的,因为如果它大于股息,它将是我们可以添加到商中的另一个值,而不是余数

现在,我们回到您的示例。您使用的是一个长值,它可以比传入的10亿值大几个数量级或小几个数量级(它非常适合
int
,并且在调用方法时提升为
long

最终的问题归结为:

val = bits % n;
…其中,
是一些任意的
值,可能大于
n

还记得我们用上面的短除法发现了什么吗?没错-你得到的
val
将比你的
n
值低一个数量级-也就是说,它永远不会大于或等于
n


我不完全确定你想要完成什么,所以我没有正确的选择™ 但我建议你重新评估模运算的目的。

我认为你需要使用BigInt,请参阅:数字的大小应该是合适的。我很好奇你想实现什么。这个数字足够小,可以用int表示。我不确定这是怎么回事。@Makoto I think OP对此非常明确:他说他可以得到10位数(如示例所示),但他想要15位。然而,在这种方法中,他没有使用支持少于15位的东西。他甚至将其作为int传递,而int会被提升为long。我不确定为什么在位移位或模运算出现异常时,数据类型会有问题。这个数足够小足够表示为一个int了。这里还有其他的事情。