Dai un'occhiata a SQL Server: imposta numeri casuali basati su una spiegazione molto dettagliata.
Per riassumere, il seguente codice genera un numero casuale compreso tra 0 e 13 inclusi con una distribuzione uniforme:
ABS(CHECKSUM(NewId())) % 14
Per modificare l'intervallo, basta cambiare il numero alla fine dell'espressione. Fai molta attenzione se hai bisogno di un intervallo che includa numeri sia positivi che negativi. Se lo fai in modo sbagliato, è possibile contare due volte il numero 0.
Un piccolo avvertimento per i matti della matematica nella stanza: c'è un leggero pregiudizio in questo codice. CHECKSUM()
risulta in numeri che sono uniformi su tutto l'intervallo del tipo di dati Int sql, o almeno così vicino come possono mostrare i miei test (dell'editor). Tuttavia, ci sarà un certo pregiudizio quando CHECKSUM () produce un numero all'estremità superiore di tale intervallo. Ogni volta che si ottiene un numero compreso tra il numero intero massimo possibile e l'ultimo multiplo esatto della dimensione dell'intervallo desiderato (14 in questo caso) prima dell'intero massimo, tali risultati vengono favoriti rispetto alla parte rimanente dell'intervallo da cui non è possibile produrre l'ultimo multiplo di 14.
Ad esempio, immagina che l'intero intervallo del tipo Int sia solo 19. 19 è il numero intero più grande possibile che puoi contenere. Quando CHECKSUM () risulta in 14-19, questi corrispondono ai risultati 0-5. Questi numeri sarebbero fortemente favoriti su 6-13, perché CHECKSUM () ha il doppio delle probabilità di generarli. È più facile dimostrarlo visivamente. Di seguito è riportato l'intero insieme possibile di risultati per il nostro intervallo intero immaginario:
Numero intero di checksum: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
Intervallo Risultato: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 0 1 2 3 4 5
Puoi vedere qui che ci sono più possibilità di produrre alcuni numeri rispetto ad altri: il pregiudizio. Per fortuna, l'intervallo effettivo del tipo Int è molto più ampio ... al punto che nella maggior parte dei casi il bias è quasi impercettibile. Tuttavia, è qualcosa di cui tenere conto se ti ritrovi a farlo per un serio codice di sicurezza.