Переменная $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; }
...
}
Подробнее см. в этом документе .
Начиная с Java 7 (или Android API уровня 21 = 5.0+) вы можете напрямую использовать ThreadLocalRandom.current () .nextLong (n)
(для 0 ≤ x
Если вы застряли на 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;
}
Если можно использовать потоки 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.
Со страницы на 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-битный диапазон, для пример.
Стандартный метод генерации числа (без использования утилиты) в диапазоне - просто использовать 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 имеет более высокий приоритет, чем умножение.