Генерация только положительных случайных чисел в SQLite

В SQLite

на random() функция возвращает псевдослучайное целое число между -9223372036854775808 и +9223372036854775807.

Вы можете получить случайный с максимальным значением n с Select random() % n ;

но это все равно генерирует отрицательные числа. Как я могу генерировать только положительные случайные числа в SQLite ?

4 ответов


использовать ABS() функции (абсолютное значение):

SELECT ABS(RANDOM() % N)

внимание:

Если X-целое число -9223372036854775808 потом abs(X) выдает ошибку переполнения целого числа, так как нет эквивалентного положительного 64-разрядного значения дополнения two.


для создания положительный(включая ноль) случайное число только с верхней границей, используйте

SELECT ABS(RANDOM() % N)

для создания положительное и ненулевой случайных чисел, используйте

SELECT ABS(RANDOM()) % (HIGH - LOW) + LOW

высокий - представляет верхнюю границу

низкий - это нижняя граница.


метод random() % n для получения случайного числа в определенном диапазоне имеет недостатки, так как это даст неравномерное распределение. Число ноль будет появляться в два раза чаще, чем любое другое число.

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

abs(random() % n)

SELECT ABS(RANDOM() % N)

и

SELECT ABS(RANDOM()) % N

и tend чтобы дать желаемый результат.

на мой взгляд, второй более читаемый. Сначала мы случайным образом выбираем целое число, затем применяем ABS (), чтобы оно было неотрицательным, затем по модулю N выбираем соответствующий диапазон.

однако первый метод более надежен. Второй метод имеет очень низкий, но ненулевой риск выбрасывания целочисленного переполнения, как отмечено NullUserException.