Генерация только положительных случайных чисел в SQLite - PullRequest
11 голосов
/ 29 ноября 2011

В SQLite

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

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

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

Ответы [ 4 ]

21 голосов
/ 29 ноября 2011

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

SELECT ABS(RANDOM() % N)

Обратите внимание:

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

5 голосов
/ 27 июня 2016

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

SELECT ABS(RANDOM() % N)

Для генерации положительного и ненулевого случайное число, используйте

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

HIGH - представляет верхнюю границу

LOW - представляет нижнюю границу.

3 голосов
/ 29 ноября 2011

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

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

abs(random() % n)
0 голосов
/ 09 мая 2015
SELECT ABS(RANDOM() % N)

и

SELECT ABS(RANDOM()) % N

оба имеют тенденцию давать желаемый результат.

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

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

...