SQL Server-セットベースの乱数を見てください。これには非常に詳細な説明があります。
要約すると、次のコードは0から13までの乱数を生成し、一様な分布を示します。
ABS(CHECKSUM(NewId())) % 14
範囲を変更するには、式の最後にある数値を変更します。正の数と負の数の両方を含む範囲が必要な場合は、特に注意してください。間違えた場合は、数値0を二重にカウントする可能性があります。
部屋の数学のナッツに対する小さな警告:このコードには非常にわずかな偏りがあります。CHECKSUM()
結果は、sql Intデータ型の範囲全体で均一であるか、少なくとも私の(エディター)テストが示すことができる程度に近い数値になります。ただし、CHECKSUM()がその範囲の最上位で数値を生成する場合、バイアスが発生します。最大可能整数と、その最大整数の前に目的の範囲のサイズの最後の正確な倍数(この場合は14)の間の数値を取得すると、それらの結果は、範囲の残りの部分よりも優先されます。その最後の14の倍数。
例として、Int型の範囲全体が19しかないことを想像してください。19は、保持できる最大の整数です。CHECKSUM()の結果が14〜19の場合、これらは結果0〜5に対応します。CHECKSUM()がそれらを生成する可能性が2倍であるため、これらの数値は6〜13よりも大幅に優先されます。これを視覚的に示す方が簡単です。以下は、架空の整数の範囲で考えられる結果セット全体です。
チェックサム整数:0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
範囲結果:0 1 2 3 4 5 6 7 8 9 10 11 12 13 0 1 2 3 4 5
他の数値よりもいくつかの数値を生成する可能性が高いことがわかります:バイアス。ありがたいことに、Int型の実際の範囲ははるかに大きいので、ほとんどの場合、バイアスはほとんど検出されません。ただし、深刻なセキュリティコードに対してこれを行っている場合は、注意が必要です。