Java获得大于1000000000的Long

时间:2014-09-19 18:01:24

标签: java

在这个简单的代码中,我不能让肺大于1000000000。长度是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;
}

4 个答案:

答案 0 :(得分:6)

您的long常量缺少L后缀:

long value = nextLong(rand,100000000000000L);
  

我希望变得比15个角色更大。

Java long的范围为-9223372036854775808至9223372036854775807(18位全数+ 0位内的最高位数),足以涵盖您需要涵盖的范围。如果您需要19个十进制数字或更多,则需要使用BigInteger

答案 1 :(得分:1)

你应该可以使用BigInt。

使用导入:

import java.math.BigInteger;

声明如下:

BigInteger myBigInt = new BigInteger("123456789123456789");

答案 2 :(得分:0)

提高&#39; n&#39;的限额值。由于您通过执行模数来限制生成的随机值,显然生成的值必须小于&#39; n&#39; n。由于您的限制很长,您可以增加该限制以允许15位数的结果而无需其他更改。

但是我不确定你在nextLong函数中使用循环试图完成什么。它只会在比特&gt;时循环。 (Long.MAX - n + 1)。

答案 3 :(得分:0)

我觉得你通过自己的模运算来限制自己。

请记住,模数除法与短划分相同 - 我们在三年级时使用的那种。也就是说,我们不是将整个数字除去,而是取整个部分和其余部分。

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

99 / 10 = 9 remainder 9 

也就是说,如果我使用短划分将99除以10,我将能够将其均分9次,剩余9位。请注意,剩余部分比我所分配的数量级要短一些。

这会随着更高的除数顺序而扩大:

999 / 10 = 99 remainder 9
9999 / 10 = 999 remainder 9
99999 / 10 = 9999 remainder 9

......等等。请注意,我们的余数总是比我们的股息低一个数量级。这是有道理的,因为如果它大于我们的股息,它就是我们可以添加到商的另一个值,而不是余数。

现在,我们回到你的榜样。您需要获取一个较长的值,该值可能比您传递的十亿(适用于int的数值大或小几个数量级,并且会提升为long当你打电话给你的方法时。)

最终的问题归结为:

val = bits % n;

...其中bits可能大于long的任意n值。

还记得上面我们通过上面的短划分发现了什么吗?这是正确的 - 您生成的val将比n值低一个数量级 - 也就是说,永远不会大于或等于n

我不完全确定你想要完成的是什么,所以我没有让你做的正确的事情。但我建议您重新评估该模运算的目的。