T-SQL - RAND 関数の使い方と注意点:乱数を生成する方法
RAND 関数の使い方と注意点:乱数を生成する方法
プログラムでランダムな数字を生成したい時があるかもしれません。
SQL Server の RAND 関数を使うと、0 以上 1 未満の浮動小数点の乱数を簡単に生成することができます。
この記事では、RAND 関数の使い方や注意点などをご説明します。
RAND 関数とは?(概要と戻り値)
SQL Server の RAND 関数は、擬似乱数(疑似的なランダムな値)を生成する関数です。
戻り値は常に 0 以上 1 未満 の float 型の値になります。
構文は以下の通りで、オプショナルな入力引数にシードを受け取ります。
RAND ( [シード] )
RAND 関数の基本的な使い方
まず、シンプルにRAND 関数を使って値を取得してみます。
SELECT RAND();
このクエリを実行するたびに、0以上1未満の異なる乱数が返されます。ただし、同一クエリ内では同じ値になることがあるため注意が必要です(後述)。
[実行結果] 1 回目
[実行結果] 2 回目
シード値には、任意の整数を指定でき、シード値を渡すと、毎回同じ乱数が生成されます。
テストや再現性のある処理を行いたいときに便利です。
SELECT RAND(567);
[実行結果] 1 回目
[実行結果] 2 回目
1 回目の実行、2 回目の実行で、同じ値が返ってきていますね。
任意の範囲で乱数を生成する方法
0 以上 1 未満ではなく、ある範囲内の乱数を生成したい時があるかもしれません。
例えば、RAND 関数を使って、1 から 100 の整数乱数を作りたい場合は、次のようにできます。
SELECT FLOOR(RAND() * 100) + 1;
まず、RAND 関数で 0 以上 1 未満の数値を取得して、それに 100 をかけることで、 0 ~ 100 未満の数値にしています。
小数点以下を取り除くために FLOOR 関数で切り捨て、さらに 1 を足すことで 1〜100 の範囲になります。
[実行結果] 1 回目
[実行結果] 2 回目
1 回目実行時は 18、2 回目実行時は 68 と、1 ~ 100 の整数乱数が取得できています。
行ごとに異なる乱数を生成する方法
RAND 関数を使う際に、気をつけないといけないのは、RAND 関数は、1つのテーブルに対する SELECT 文などでは、1 ステートメント内で 1 回しか評価されず、すべての行に同じ乱数が適用されるという挙動になる点です。
例えば、次のように RAND 関数を使って各行に異なる乱数を生成しようと思っても、同じ値が返ってきてしまいます。
SELECT name, RAND() AS RandValue FROM sys.objects;
[実行結果]
RAND 関数 を使って、行ごとに異なる乱数を生成したい場合には、次のようにできます。
SELECT name, RAND(CHECKSUM(NEWID())) AS RandValue FROM sys.objects;
まず、NEWID 関数を使って、行ごとに異なる GUID を生成しています。
CHECKSUM 関数 は「ハッシュ的な数値を簡単に得る」ための軽量な関数です。
生成した GUID を CHECKSUM 関数に渡して整数化しています。
CHECKSUM 関数の戻り値を、RAND 関数のシードに使うことによって、各行に異なる乱数が生成されるようにしています。
[実行結果]
実行してみると、各行に違う乱数が返ってきているのがわかります。
以上、RAND 関数の基本的な使い方と、実務で役立つ注意点をご紹介しました。
T-SQL でテストデータを作ったり、処理の一部をランダム化したいときにぜひ活用してみてください。