Java:0 <= x < n范围内的随机长数ThreadLocalRandom

2022-08-31 07:29:48

Random 类具有在给定范围内生成随机 int 的方法。例如:

Random r = new Random(); 
int x = r.nextInt(100);

这将生成一个大于或等于 0 且小于 100 的整数。我想用长数字做同样的事情。

long y = magicRandomLongGenerator(100);

随机类只有 nextLong(),但它不允许设置范围。


答案 1

Java 7(或Android API级别21 = 5.0 +)开始,您可以直接使用(对于0≤ x < n)和(对于m ≤ x < n)。有关详细信息,请参阅@Alex的答案。ThreadLocalRandom.current().nextLong(n)ThreadLocalRandom.current().nextLong(m, n)


如果您坚持使用Java 6(或Android 4.x),则需要使用外部库(例如,请参阅@mawaldne的答案),或者实现自己的。org.apache.commons.math3.random.RandomDataGenerator.getRandomGenerator().nextLong(0, n-1)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

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;
}

答案 2

ThreadLocalRandom

ThreadLocalRandom 有一个 nextLong(long bound) 方法。

long v = ThreadLocalRandom.current().nextLong(100);

它也有 nextLong(长原点,长边界),如果你需要一个 0 以外的原点。传递原点(包括)和绑定(独占)。

long v = ThreadLocalRandom.current().nextLong(10,100); // For 2-digit integers, 10-99 inclusive.

SplittableRandom具有相同的方法,如果您想要可重现的数字序列,则可以选择种子。nextLong


推荐