Spójrz na SQL Server - Ustaw losowe liczby oparte na bardzo szczegółowym objaśnieniu.
Podsumowując, poniższy kod generuje liczbę losową od 0 do 13 włącznie o jednolitym rozkładzie:
ABS(CHECKSUM(NewId())) % 14
Aby zmienić zakres, wystarczy zmienić liczbę na końcu wyrażenia. Zachowaj szczególną ostrożność, jeśli potrzebujesz zakresu obejmującego zarówno liczby dodatnie, jak i ujemne. Jeśli zrobisz to źle, możliwe jest podwójne policzenie liczby 0.
Małe ostrzeżenie dla orzechów matematycznych w pokoju: w tym kodzie jest bardzo niewielki błąd. CHECKSUM()
skutkuje liczbami, które są jednolite w całym zakresie typu danych sql Int lub przynajmniej tak blisko, jak może pokazać moje (edytor) testowanie. Jednak wystąpi pewne odchylenie, gdy CHECKSUM () wygeneruje liczbę na samym górnym końcu tego zakresu. Za każdym razem, gdy pojawi się liczba między maksymalną możliwą liczbą całkowitą a ostatnią dokładną wielokrotnością rozmiaru pożądanego zakresu (w tym przypadku 14) przed tymi liczbami całkowitymi, wyniki te są uprzywilejowane w stosunku do pozostałej części zakresu, z której nie można uzyskać ostatnia wielokrotność 14.
Jako przykład wyobraź sobie, że cały zakres typu Int wynosi tylko 19. 19 to największa możliwa liczba całkowita, jaką możesz pomieścić. Kiedy CHECKSUM () daje wynik 14-19, odpowiadają one wynikom 0-5. Liczby te byłyby znacznie bardziej uprzywilejowane w zakresie 6-13, ponieważ CHECKSUM () ma dwa razy większe szanse na ich wygenerowanie. Łatwiej jest to zademonstrować wizualnie. Poniżej znajduje się cały możliwy zestaw wyników dla naszego wyimaginowanego zakresu liczb całkowitych:
Liczba całkowita sumy kontrolnej: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
Wynik zakresu: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 0 1 2 3 4 5
Widać tutaj, że istnieje większa szansa na uzyskanie niektórych liczb niż innych: stronniczości. Na szczęście rzeczywisty zasięg typu Int jest znacznie większy ... tak bardzo, że w większości przypadków odchylenie jest prawie niewykrywalne. Należy jednak pamiętać, jeśli robisz to z poważnym kodem bezpieczeństwa.