Генерация только положительных случайных чисел в 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.