T-SQL SELECT の各行に乱数を生成するにはどうすればよいでしょうか? 質問する

T-SQL SELECT の各行に乱数を生成するにはどうすればよいでしょうか? 質問する

テーブルの各行に異なる乱数が必要です。次の一見明白なコードは、各行に同じ乱数値を使用しています。

SELECT table_name, RAND() magic_number 
FROM information_schema.tables 

これから INT または FLOAT を取得したいと思います。残りのストーリーでは、このランダムな数値を使用して、既知の日付からのランダムな日付オフセット (開始日からの 1 ~ 14 日のオフセットなど) を作成します。

これは Microsoft SQL Server 2000 用です。

ベストアンサー1

を見てみましょうSQL Server - セットベースの乱数非常に詳細な説明があります。

要約すると、次のコードは、均一分布で 0 から 13 までの範囲の乱数を生成します。

ABS(CHECKSUM(NewId())) % 14

範囲を変更するには、式の末尾の数字を変更するだけです。正の数と負の数の両方を含む範囲が必要な場合は、特に注意してください。間違えると、0 が二重にカウントされる可能性があります。

数学に詳しい人へのちょっとした警告: このコードには、ほんの少し偏りがあります。CHECKSUM()結果は、SQL Int データ型の範囲全体にわたって均一な数値、または少なくとも私 (編集者) のテストでわかる限りそれに近い数値になります。ただし、CHECKSUM() がその範囲の一番上の数値を生成する場合は、多少の偏りがあります。最大可能整数と、その最大整数の前の目的の範囲のサイズの最後の正確な倍数 (この場合は 14) の間の数値が得られたときはいつでも、それらの結果は、最後の 14 の倍数から生成できない範囲の残りの部分よりも優先されます。

たとえば、Int 型の範囲全体が 19 しかないとします。19 は保持できる最大の整数です。CHECKSUM() の結果が 14 ~ 19 の場合、これらは結果 0 ~ 5 に対応します。これらの数字は6 ~ 13 よりも大幅に優先されます。CHECKSUM() がこれらの数字を生成する可能性が 2 倍高いためです。これを視覚的に説明する方が簡単です。以下は、この架空の整数範囲の結果の可能なセット全体です。

チェックサム整数: 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 型の実際の範囲ははるかに広く、ほとんどの場合、バイアスはほとんど検出されません。ただし、重大なセキュリティ コードでこれを実行する場合は、注意が必要です。

おすすめ記事