Tag et kig på SQL Server - Sæt baseret tilfældige tal, som har en meget detaljeret forklaring.
For at opsummere genererer følgende kode et tilfældigt tal mellem 0 og 13 inklusive med en ensartet fordeling:
ABS(CHECKSUM(NewId())) % 14
For at ændre dit område skal du blot ændre tallet i slutningen af udtrykket. Vær ekstra forsigtig, hvis du har brug for et interval, der indeholder både positive og negative tal. Hvis du gør det forkert, er det muligt at dobbelttælle tallet 0.
En lille advarsel til matematiknødderne i rummet:der er en meget lille skævhed i denne kode. CHECKSUM()
resulterer i tal, der er ensartede over hele rækken af sql Int-datatypen, eller i det mindste så tæt på, som min (redaktøren) test kan vise. Der vil dog være en vis skævhed, når CHECKSUM() producerer et tal i den øverste ende af dette interval. Hver gang du får et tal mellem det maksimalt mulige heltal og det sidste eksakte multiplum af størrelsen af dit ønskede interval (14 i dette tilfælde) før det maksimale heltal, favoriseres disse resultater frem for den resterende del af dit interval, som ikke kan produceres fra det sidste multiplum af 14.
Forestil dig som et eksempel, at hele området for Int-typen kun er 19. 19 er det størst mulige heltal, du kan holde. Når CHECKSUM() resulterer i 14-19, svarer disse til resultaterne 0-5. Disse tal ville være tunge favoriseret frem for 6-13, fordi CHECKSUM() er dobbelt så sandsynligt, at de genererer dem. Det er nemmere at demonstrere dette visuelt. Nedenfor er hele det mulige sæt resultater for vores imaginære heltalsområde:
Tjeksum heltal:0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19Rangeresultat:0 1 2 3 4 5 6 7 8 9 10 11 12 12 13 før>Du kan se her, at der er flere chancer for at producere nogle tal end andre:bias. Heldigvis er den faktiske rækkevidde af Int-typen meget større... så meget, at skævheden i de fleste tilfælde er næsten uopdagelig. Det er dog noget, du skal være opmærksom på, hvis du nogensinde finder dig selv at gøre dette for seriøs sikkerhedskode.