Java: случайное длинное число в диапазоне 0 <= x <n - PullRequest
119 голосов
/ 30 марта 2010

Случайный класс имеет метод для генерации случайного int в заданном диапазоне. Например:

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

Это сгенерирует целое число больше или равное 0 и меньше 100. Я хотел бы сделать то же самое с длинным числом.

long y = magicRandomLongGenerator(100);

Случайный класс имеет только nextLong (), но не позволяет устанавливать диапазон.

Ответы [ 15 ]

1 голос
/ 02 октября 2015

Дальнейшее улучшение ответа kennytm: Реализация подкласса с учетом фактической реализации в Java 8 будет:

public class MyRandom extends Random {
  public long nextLong(long bound) {
    if (bound <= 0) {
      throw new IllegalArgumentException("bound must be positive");
    }

    long r = nextLong() & Long.MAX_VALUE;
    long m = bound - 1L;
    if ((bound & m) == 0) { // i.e., bound is a power of 2
      r = (bound * r) >> (Long.SIZE - 1);
    } else {
      for (long u = r; u - (r = u % bound) + m < 0L; u = nextLong() & Long.MAX_VALUE);
    }
    return r;
  }
}
1 голос
/ 30 марта 2010

со страницы на в случайном порядке :

Метод nextLong реализуется классом Random, как если бы:

public long nextLong() {
   return ((long)next(32) << 32) + next(32);
}

Поскольку класс Random использует начальное число только с 48 битами, этот алгоритм не будет возвращать все возможные длинные значения.

Так что, если вы хотите получить Long, вы уже не получите полный 64-битный диапазон.

Я бы предположил, что если у вас есть диапазон, который приближается к степени 2, вы создаете Long как в этом фрагменте, например:

next(32) + ((long)nextInt(8) << 3)

для получения 35-битного диапазона, например.

0 голосов
/ 12 июня 2016
public static long randomLong(long min, long max)
{
    try
    {
        Random  random  = new Random();
        long    result  = min + (long) (random.nextDouble() * (max - min));
        return  result;
    }
    catch (Throwable t) {t.printStackTrace();}
    return 0L;
}
0 голосов
/ 21 июля 2015

// использовать системное время в качестве начального значения для получения хорошего случайного числа

   Random random = new Random(System.currentTimeMillis());
              long x;
             do{
                x=random.nextLong();
             }while(x<0 && x > n); 

// Цикл до получения числа, большего или равного 0 и меньшего, чем n

0 голосов
/ 08 апреля 2012

Методы, использующие r.nextDouble(), должны использовать:

long number = (long) (rand.nextDouble()*max);


long number = x+(((long)r.nextDouble())*(y-x));
...