SQLServerを見てください-非常に詳細な説明があるベースのランダムな数値を設定してください。
要約すると、次のコードは、一様分布で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よりも優先されます。これを視覚的に示す方が簡単です。以下は、架空の整数範囲で可能な結果のセット全体です。
Checksum Integer: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Range Result: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 0 1 2 3 4 5
ここで、他の数値よりもいくつかの数値を生成する可能性が高いことがわかります。バイアスです。ありがたいことに、Intタイプの実際の範囲は多くです。 より大きく...ほとんどの場合、バイアスがほとんど検出されないほどです。ただし、深刻なセキュリティコードに対してこれを行っていることに気付いた場合は、注意が必要です。