Java: random long number in 0 lt;= x lt; n range(Java:0 = x 中的随机长数n 范围)
问题描述
Random 类具有在给定范围内生成随机 int 的方法.例如:
Random class has a method to generate random int in a given range. For example:
Random r = new Random();
int x = r.nextInt(100);
这将生成一个大于或等于 0 且小于 100 的 int 数.我想对 long 数做同样的事情.
This would generate an int number more or equal to 0 and less than 100. I'd like to do exactly the same with long number.
long y = magicRandomLongGenerator(100);
Random 类只有 nextLong(),但它不允许设置范围.
Random class has only nextLong(), but it doesn't allow to set range.
推荐答案
从Java 7(或Android API Level 21 = 5.0+)开始你可以直接使用ThreadLocalRandom.current().nextLong(n)(对于 0 ≤ x
Starting from Java 7 (or Android API Level 21 = 5.0+) you could directly use ThreadLocalRandom.current().nextLong(n) (for 0 ≤ x < n) and ThreadLocalRandom.current().nextLong(m, n) (for m ≤ x < n). See @Alex's answer for detail.
如果您使用 Java 6(或 Android 4.x),您需要使用外部库(例如 org.apache.commons.math3.random.RandomDataGenerator.getRandomGenerator().nextLong(0, n-1),请参阅 @mawaldne 的答案),或实施您的自己的 nextLong(n).
If you are stuck with Java 6 (or Android 4.x) you need to use an external library (e.g. org.apache.commons.math3.random.RandomDataGenerator.getRandomGenerator().nextLong(0, n-1), see @mawaldne's answer), or implement your own nextLong(n).
根据 https://docs.oracle.com/javase/1.5.0/docs/api/java/util/Random.html nextInt 实现为
public int nextInt(int n) {
if (n<=0)
throw new IllegalArgumentException("n must be positive");
if ((n & -n) == n) // i.e., n is a power of 2
return (int)((n * (long)next(31)) >> 31);
int bits, val;
do {
bits = next(31);
val = bits % n;
} while(bits - val + (n-1) < 0);
return val;
}
所以我们可以修改它来执行 nextLong:
So we may modify this to perform nextLong:
long nextLong(Random rng, long n) {
// error checking and 2^x checking removed for simplicity.
long bits, val;
do {
bits = (rng.nextLong() << 1) >>> 1;
val = bits % n;
} while (bits-val+(n-1) < 0L);
return val;
}
这篇关于Java:0 <= x <中的随机长数n 范围的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:Java:0 <= x <中的随机长数n 范围
基础教程推荐
- RabbitMQ:消息保持“未确认"; 2022-01-01
- 问题http://apache.org/xml/features/xinclude测试日志4j 2 2022-01-01
- 存储 20 位数字的数据类型 2022-01-01
- REST Web 服务返回 415 - 不支持的媒体类型 2022-01-01
- 无法复制:“比较方法违反了它的一般约定!" 2022-01-01
- 如何对 Java Hashmap 中的值求和 2022-01-01
- Struts2 URL 无法访问 2022-01-01
- 使用堆栈算法进行括号/括号匹配 2022-01-01
- Spring AOP错误无法懒惰地为此建议构建thisJoinPoin 2022-09-13
- 修改 void 函数的输入参数,然后读取 2022-01-01
