次の方法で共有


RAND 関数の使用

RAND 関数は 0 ~ 1 の間の浮動小数点乱数を計算します。オプションで、計算する乱数の開始位置として tinyint 型、int 型、または smallint 型の値をとることができます。

次の例では 2 つの乱数を計算しています。SQL Server では、最初の RAND() 関数によって seed の値が選択され、2 番目の RAND() 関数では 3 が開始位置の値として使用されます。

SELECT RAND(), RAND(3);

RAND 関数は、C ランタイム ライブラリ rand 関数と同じように動作する擬似乱数生成関数です。seed を指定しなかった場合は、システムが独自の可変の seed の値を生成します。seed の値を指定して RAND 関数を呼び出す場合は、可変の seed の値を使用して乱数を生成する必要があります。同じ seed の値を指定して RAND 関数を複数回呼び出すと、同じ値が返されます。次のスクリプトは同じ seed の値を指定しているので、同じ値を返します。

SELECT RAND(159784);
SELECT RAND(159784);
SELECT RAND(159784);

RAND 関数で乱数を生成する一般的な方法は、比較的可変の値を seed の値として指定する方法です。たとえば、次の例は GETDATE の複数の日付の要素を加算します。

SELECT RAND( (DATEPART(mm, GETDATE()) * 100000 )
           + (DATEPART(ss, GETDATE()) * 1000 )
           + DATEPART(ms, GETDATE()) );

GETDATE に基づくアルゴリズムを使用して seed の値を計算する場合でも、アルゴリズムで使用されている最小の日付の要素の間隔の中で RAND 関数を呼び出すと、重複した値が返されることがあります。特に、同じバッチ内で RAND 関数が複数回呼び出された場合は、重複した値が返される可能性があります。同じバッチ内で RAND 関数を複数回呼び出すと、同じミリ秒の間に関数が実行されます。これは DATEPART の最小増分です。この場合は、時刻以外の値も組み込んで seed 値を生成してください。