PostgreSQLでは、random()
関数は、0.0 <=x<1.0の範囲の疑似乱数値を返します。
これは、最も古く、最もよく知られている疑似乱数生成アルゴリズムの1つである単純な線形合同アルゴリズムを使用します。
疑似乱数は、ランダムに見えるが、真にランダムではない数です。疑似乱数は、その値が既知のシードによって生成されたため、真にランダムではありません。ただし、ユーザーがシードまたはそれを作成したアルゴリズムの知識がない場合は、ランダムに表示されます。
したがって、多くのアプリケーションでは、疑似乱数で十分と見なされることがよくあります。
例
random()
を使用して疑似乱数を生成する例を次に示します。 機能。
SELECT random();
結果:
0.625357600199532
呼び出すたびに結果が明らかに異なります。
同じステートメントで関数を3回呼び出す別の例を次に示します。
SELECT
random(),
random(),
random();
結果:
random | random | random -------------------+---------------------+-------------------- 0.594431747016209 | 0.22816249693650903 | 0.7168820259873314
1から10までのランダムな数字
これは、0から10までの正の数を生成する例です。
SELECT random() * 10 + 1;
結果:
4.564859004063727
明確にするために、これは1以上10未満のランダムな数を生成します。
ランダム整数
trunc()
などの関数を使用できます またはfloor()
乱数を整数として返します。
SELECT
trunc(random() * 10 + 1),
floor(random() * 10 + 1);
結果:
trunc | floor -------+------- 1 | 8
ランダム行を返す
random()
を使用できます ORDER BY
で ランダムな行を返すデータベースクエリの句。
pagilaにクエリを実行する例を次に示します。 サンプルデータベース。
SELECT
film_id,
title
FROM film
ORDER BY random() LIMIT 5;
結果:
film_id | title ---------+--------------------- 116 | CANDIDATE PERDITION 806 | SLEEPY JAPANESE 892 | TITANIC BOONDOCK 826 | SPEED SUIT 612 | MUSSOLINI SPOILERS
そして、もう一度実行すると、次のようになります。
film_id | title ---------+-------------------- 450 | IDOLS SNATCHERS 827 | SPICE SORORITY 593 | MONTEREY LABYRINTH 529 | LONELY ELEPHANT 591 | MONSOON CAUSE
大きなテーブルがあり、すべての行(または多数の行)を返す必要がある場合は、クエリを次のように変更することをお勧めします。
SELECT *
FROM film
WHERE film_id IN
(SELECT film_id FROM film ORDER BY random() LIMIT 5);
繰り返し可能なランダムな数字を作成する
Postgresにはsetseed()
もあります 後続のrandom()
のシードを設定できる関数 同じセッション内の呼び出し。
setseed()
を使用できます 繰り返し可能なrandom()
を生成します 呼び出します。
例については、PostgresでのSetseed()の動作を参照してください。