Взгляните на 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, потому что СУММА () в два раза больше шансов для их создания . Это проще продемонстрировать визуально. Ниже представлен весь возможный набор результатов для нашего воображаемого целочисленного диапазона:
Целевая контрольная сумма: 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 намного больше ... настолько, что в большинстве случаев смещение почти не обнаружено. Однако об этом следует знать, если вы когда-нибудь обнаружите, что делаете это для серьезного кода безопасности.