SQL Server-Set based random numbers 를 살펴보십시오 . 자세한 설명이 나와 있습니다.
요약하면, 다음 코드는 균일 분포로 0에서 13 사이의 난수를 생성합니다.
ABS(CHECKSUM(NewId())) % 14
범위를 변경하려면 식 끝에 숫자를 변경하십시오. 양수와 음수를 모두 포함하는 범위가 필요한 경우 각별히주의하십시오. 잘못하면 숫자 0을 두 번 계산할 수 있습니다.
방의 수학 너트에 대한 작은 경고 :이 코드에는 약간의 편견이 있습니다. CHECKSUM()
sql Int 데이터 유형의 전체 범위에서 균일하거나 최소한 (편집자) 테스트가 표시 할 수있는 정도의 숫자가됩니다. 그러나 CHECKSUM ()이 해당 범위의 맨 끝에 숫자를 생성 할 때 약간의 편차가 있습니다. 가능한 최대 정수와 원하는 최대 크기 (이 경우 14)의 크기의 마지막 정확한 배수 사이의 숫자를 얻을 때마다 그 결과는 범위의 나머지 부분보다 선호됩니다. 마지막 배수는 14의 배수입니다.
예를 들어, Int 유형의 전체 범위가 19에 불과하다고 가정하십시오. 19는 보유 할 수있는 가장 큰 정수입니다. CHECKSUM ()의 결과가 14-19 인 경우 결과 0-5에 해당합니다. CHECKSUM ()이 생성 할 가능성이 두 배이기 때문에이 숫자는 6-13보다 많이 선호됩니다. 이것을 시각적으로 설명하는 것이 더 쉽습니다. 다음은 가상 정수 범위에 대한 가능한 전체 결과 집합입니다.
체크섬 정수 : 12 34 5678 9 10 11 12 1314 15 16 17 18 19
범위 결과 : 12 34 5678 9 10 11 12 1103 34 5
여기에서 다른 것보다 더 많은 숫자를 생성 할 수있는 기회가 더 많다는 것을 알 수 있습니다 : 편향. 고맙게도 Int 유형의 실제 범위는 훨씬 큽니다. 그래서 대부분의 경우 바이어스를 거의 감지 할 수 없습니다. 그러나 심각한 보안 코드를 위해이 작업을 수행하는 경우 알고 있어야합니다.