Погляньте на SQL Server - встановіть на основі випадкових чисел, що має дуже детальне пояснення.
Підводячи підсумок, наступний код генерує випадкове число від 0 до 13 включно з рівномірним розподілом:
ABS(CHECKSUM(NewId())) % 14
Щоб змінити діапазон, просто змініть число в кінці виразу. Будьте особливо обережні, якщо вам потрібен діапазон, що включає як додатні, так і негативні числа. Якщо ви зробите це неправильно, можна подвоїти число 0.
Невелике попередження про математичні гайки в кімнаті: у цьому коді є дуже незначна упередженість. CHECKSUM()
приводить до цифр, однакових у всьому діапазоні типу даних sql Int, або, принаймні, так близько, як може показати моє (редакторське) тестування. Однак буде деякий ухил, коли CHECKSUM () видасть число в самому верхньому кінці цього діапазону. Щоразу, коли ви отримуєте число між максимально можливим цілим числом і останнім точним кратним розміром потрібного діапазону (14 у цьому випадку) перед цим максимальним цілим числом, ці результати надаються переваги над тією частиною, що залишилась у вашому діапазоні, яку неможливо отримати з що останні кратні 14.
Як приклад, уявіть, що весь діапазон типу Int становить лише 19. 19 - це найбільше можливе ціле число, яке ви можете вмістити. Коли CHECKSUM () призводить до 14-19, вони відповідають результатам 0-5. Ці цифри будуть сильно віддані переваги протягом 6-13, оскільки CHECKSUM () вдвічі частіше їх генерує. Це простіше продемонструвати візуально. Нижче наведено весь можливий набір результатів для нашого уявного цілого діапазону:
Цінна сума: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
Результат діапазону: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 0 1 2 3 4 5
Тут ви бачите, що є більше шансів отримати деякі числа, ніж інші: зміщення. На щастя, фактичний діапазон типу Int значно більший ... настільки, що в більшості випадків зміщення майже не виявляється. Однак вам слід пам’ятати про те, якщо ви коли-небудь виявите це для серйозного коду безпеки.