Dê uma olhada no SQL Server - Defina números aleatórios baseados em uma explicação muito detalhada.
Para resumir, o código a seguir gera um número aleatório entre 0 e 13, inclusive com uma distribuição uniforme:
ABS(CHECKSUM(NewId())) % 14
Para alterar seu intervalo, basta alterar o número no final da expressão. Tenha muito cuidado se precisar de um intervalo que inclua números positivos e negativos. Se você errar, é possível contar duas vezes o número 0.
Um pequeno aviso para as porcas matemáticas da sala: há um pequeno viés nesse código. CHECKSUM()
resulta em números uniformes em todo o intervalo do tipo de dados sql Int, ou pelo menos o mais próximo possível para o meu teste (do editor). No entanto, haverá algum viés quando CHECKSUM () produzir um número na extremidade superior desse intervalo. Sempre que você obtém um número entre o número máximo máximo possível e o último múltiplo exato exato do tamanho do intervalo desejado (14 neste caso) antes desse número máximo máximo, esses resultados são favorecidos sobre a parte restante do intervalo que não pode ser produzida a partir de esse último múltiplo de 14.
Como um exemplo, imagine que todo o intervalo do tipo Int seja apenas 19. 19 é o maior número possível possível. Quando CHECKSUM () resulta em 14-19, eles correspondem aos resultados 0-5. Esses números seriam altamente favorecidos entre 6-13, porque CHECKSUM () tem duas vezes mais chances de gerá-los. É mais fácil demonstrar isso visualmente. Abaixo está todo o conjunto possível de resultados para o nosso intervalo inteiro imaginário:
Número inteiro de soma de verificação: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
Resultado do intervalo: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 0 1 2 3 4 5
Você pode ver aqui que há mais chances de produzir alguns números do que outros: viés. Felizmente, o alcance real do tipo Int é muito maior ... tanto que, na maioria dos casos, o viés é quase indetectável. No entanto, é algo a ter em atenção se você se encontra fazendo isso por um código de segurança sério.