1. 導入:なぜSQLiteでの乱数生成が必要か
データベース開発やテストにおいて、「ダミーデータの作成」や「ランダムなサンプル行の抽出」は避けて通れない作業です。特に開発環境で本番に近いボリュームのテストデータを作成する際、機械的に連番を入れるだけでは不十分なケースが多々あります。SQLiteのrandom関数を適切に使いこなすことで、クエリ一つで柔軟なテストデータ生成やデータサンプリングが可能になります。
2. 基礎知識:random関数とは
SQLiteのrandom関数は、-9223372036854775808 から 9223372036854775807 までの範囲で64ビットの符号付き整数を生成する関数です。
ポイントは「戻り値が非常に広い範囲である」ことです。そのままでは使いにくいため、以下の関数を組み合わせて加工するのが実務の定石です。
・abs関数:負の値を正の値に変換します。
・%(剰余)演算子:数値を指定した数で割った余りを取得し、範囲を限定します。
3. 実装/解決策:特定の範囲に収める方法
現場でよくある「0からN-1までの乱数が欲しい」というケースでは、「abs(random()) % N」というパターンが鉄板です。また、1からNまでの範囲にしたい場合は、「abs(random()) % N + 1」とすることで調整可能です。
4. サンプルプログラム
以下のSQLは、テストデータ生成時やデータ抽出時によく使われるパターンです。そのままコピーしてSQLiteクライアントで実行してみてください。
— 1. 0から9までの乱数を生成
SELECT abs(random()) % 10 AS random_0_to_9;
— 2. 1から10までの乱数を生成(ID割り振りなどで多用)
SELECT (abs(random()) % 10) + 1 AS random_1_to_10;
— 3. 既存テーブルからランダムに5行抽出するテクニック
— ORDER BYにrandom()を指定することで、結果セットをシャッフルしてから取得します
SELECT FROM users ORDER BY random() LIMIT 5;
— 4. 範囲指定(例:50から100まで)の乱数生成
— (abs(random()) % (最大値 – 最小値 + 1)) + 最小値 という計算式になります
SELECT (abs(random()) % 51) + 50 AS random_50_to_100;
5. 応用・注意点:現場で陥りやすい罠
注意点1:偏りの可能性
random関数による剰余演算(%)は、母数が非常に大きいため、実用上は十分にランダムに見えます。しかし、厳密な統計的分布が必要なシミュレーションなどには適さない場合があります。あくまで「ダミーデータの生成」や「簡易的なランダム抽出」として割り切って使用してください。
注意点2:パフォーマンスへの影響
「ORDER BY random()」は非常に便利ですが、テーブルの行数が多い場合、すべての行に対して乱数を生成・ソートするためパフォーマンスが極端に低下します。数万行を超える大規模なテーブルで「ランダムに1行取得したい」場合は、IDの最大値を取得した上で「WHERE id = (abs(random()) % max_id)」のように、インデックスを利用した抽出方法を検討してください。

コメント