Обърнете внимание на 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 5 предварително>Тук можете да видите, че има повече шансове за генериране на някои числа от други:пристрастие. За щастие действителният диапазон на типа Int е много по-голям... толкова много, че в повечето случаи отклонението е почти неоткриваемо. Все пак трябва да имате предвид, ако някога се окажете, че правите това за сериозен код за сигурност.