Java: случайное длинное количество в 0 <= x <n диапазон

Переменная $request_uri содержит весь URL. Вы можете использовать map, чтобы перевести его в перенаправление.

map $request_uri $target {
    ~*^/mens/shop\?q=road\+map\+polo   /t/category/golf-knits;
    ~*^/mens/shop\?q=six\+pocket\+pant /t/category/golf-pants;
}

server {
    ...
    if ($target) { return 301 $target; }
    ...
}

Подробнее см. в этом документе .

128
задан Vilius Normantas 30 March 2010 в 14:41
поделиться

4 ответа

Начиная с Java 7 (или Android API уровня 21 = 5.0+) вы можете напрямую использовать ThreadLocalRandom.current () .nextLong (n) (для 0 ≤ x ThreadLocalRandom.current (). nextLong (m, n) (для m ≤ x @Alex .


Если вы застряли на Java 6 (или Android 4.x), вам необходимо использовать внешнюю библиотеку (например, org.apache.commons.math3.random.RandomDataGenerator.getRandomGenerator () .nextLong (0, n-1) , см. ответ @mawaldne ) или реализовать свой собственный nextLong (n) .

Согласно http://java.sun.com/j2se/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;
}
143
ответ дан 24 November 2019 в 00:35
поделиться

Если можно использовать потоки Java, можно попробовать следующее:

Random randomizeTimestamp = new Random();
Long min = ZonedDateTime.parse("2018-01-01T00:00:00.000Z").toInstant().toEpochMilli();
Long max = ZonedDateTime.parse("2019-01-01T00:00:00.000Z").toInstant().toEpochMilli();
randomizeTimestamp.longs(generatedEventListSize, min, max).forEach(timestamp -> {
  System.out.println(timestamp);
});

Это генерирует числа в данном диапазоне для longs.

0
ответ дан 24 November 2019 в 00:35
поделиться

Со страницы на Random :

Метод 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-битный диапазон, для пример.

1
ответ дан 24 November 2019 в 00:35
поделиться

Стандартный метод генерации числа (без использования утилиты) в диапазоне - просто использовать double с диапазоном:

long range = 1234567L;
Random r = new Random()
long number = (long)(r.nextDouble()*range);

даст вам long от 0 (включительно) до range (исключая). Аналогично, если вам нужно число между x и y:

long x = 1234567L;
long y = 23456789L;
Random r = new Random()
long number = x+((long)(r.nextDouble()*(y-x)));

даст вам long от 1234567 (включительно) до 123456789 (исключая)

Примечание: проверьте круглые скобки, потому что приведение к long имеет более высокий приоритет, чем умножение.

72
ответ дан 24 November 2019 в 00:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: