在这个简单的代码中,我不能让肺大于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;
}
答案 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
。
我不完全确定你想要完成的是什么,所以我没有让你做的正确的事情。但我建议您重新评估该模运算的目的。