Werfen Sie einen Blick auf SQL Server - Set-basierte Zufallszahlen, die eine sehr detaillierte Erklärung enthalten.
Zusammenfassend erzeugt der folgende Code eine Zufallszahl zwischen 0 und einschließlich 13 mit einer gleichmäßigen Verteilung:
ABS(CHECKSUM(NewId())) % 14
Um Ihren Bereich zu ändern, ändern Sie einfach die Zahl am Ende des Ausdrucks. Seien Sie besonders vorsichtig, wenn Sie einen Bereich benötigen, der sowohl positive als auch negative Zahlen enthält. Wenn Sie es falsch machen, können Sie die Zahl 0 doppelt zählen.
Eine kleine Warnung für die Mathe-Nüsse im Raum: Dieser Code enthält eine sehr leichte Abweichung. CHECKSUM()
führt zu Zahlen, die über den gesamten Bereich des SQL Int-Datentyps einheitlich sind oder zumindest so nahe, wie meine (der Editor-) Tests zeigen können. Es wird jedoch eine gewisse Verzerrung geben, wenn CHECKSUM () eine Zahl ganz oben in diesem Bereich erzeugt. Jedes Mal, wenn Sie vor dieser maximalen Ganzzahl eine Zahl zwischen der maximal möglichen Ganzzahl und dem letzten exakten Vielfachen der Größe Ihres gewünschten Bereichs (in diesem Fall 14) erhalten, werden diese Ergebnisse gegenüber dem verbleibenden Teil Ihres Bereichs bevorzugt, aus dem nicht erzeugt werden kann das letzte Vielfache von 14.
Stellen Sie sich als Beispiel vor, der gesamte Bereich des Int-Typs ist nur 19. 19 ist die größtmögliche Ganzzahl, die Sie halten können. Wenn CHECKSUM () zu 14-19 führt, entsprechen diese den Ergebnissen 0-5. Diese Zahlen würden gegenüber 6-13 stark bevorzugt, da CHECKSUM () sie mit doppelter Wahrscheinlichkeit generiert. Es ist einfacher, dies visuell zu demonstrieren. Nachfolgend finden Sie die gesamte mögliche Ergebnismenge für unseren imaginären ganzzahligen Bereich:
Prüfsumme Ganzzahl: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
Bereich Ergebnis: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 0 1 2 3 4 5
Sie können hier sehen, dass es mehr Chancen gibt, einige Zahlen zu produzieren als andere: Voreingenommenheit. Zum Glück ist der tatsächliche Bereich des Int-Typs viel größer ... so sehr, dass in den meisten Fällen die Vorspannung fast nicht nachweisbar ist. Es ist jedoch etwas zu beachten, wenn Sie dies jemals für einen ernsthaften Sicherheitscode tun.