- カテゴリ:
RANDOM¶
各呼び出しは、擬似ランダム64ビット整数を返します。
構文¶
RANDOM([seed])
引数¶
オプション:
seed
シードは整数です。シードが異なると、 RANDOM は異なる出力値を生成します。
シードが提供されない場合は、プラットフォーム固有の方法でランダムシードが選択されます。
使用上の注意¶
SQL ステートメントが各行に同じシードを使用して RANDOM を呼び出す場合は、シードが同じであっても、 RANDOM は各行に異なる値を返します。
SQL ステートメントが 同じ行 に対して 同じシード を使用して RANDOM を複数回呼び出す場合、 RANDOM は、 その行の 呼び出しごとに同じ値を返します。たとえば、次の場合、各行に対して同じ値が2回返されます。
select random(42), random(42) from table1
。以下の例 をご参照ください。
RANDOM を呼び出すステートメントが複数回実行された場合、 RANDOM が毎回同じ値のセットを生成するという 保証はありません。これは、シードを指定するかどうかに関係なく当てはまります。
同じステートメントが同じデータで呼び出された場合でも、 RANDOM は異なる値を生成する可能性があります。たとえば、これは次の場合に発生する可能性があります。
ワーカースレッドの数が異なる。
行が異なる順序で処理される。
ランダム値が必ずしも一意の値ではない。少数のコールでは重複はまれですが、コールの数が増えると重複の可能性は高くなります。一意の値が必要な場合は、 RANDOMの呼び出しではなく、シーケンス(SEQ1 / SEQ2 / SEQ4 / SEQ8)の使用を検討してください。ラップアラウンドの可能性が低い十分なビットのシーケンスを選択します。
出力は有限の整数であり、値は真にランダムではなくアルゴリズムによって生成されるため、関数は最終的に「ラップアラウンド」し、値のシーケンスの繰り返しを開始します。ただし、「期間」(ラップする前の呼び出しの数)は非常に大きくなります。2^19937 - 1。
出力は擬似ランダムのみです。十分な情報(アルゴリズムとシードを含む)が与えられると、出力を予測できます。
RANDOM は、MT19937-64として知られる、64ビット Mersenneツイスター アルゴリズムを実装しています。
擬似乱数の生成は、計算に多少費用がかかります。この関数を大量に呼び出すと、大量のリソースが消費される可能性があります。
例¶
次の例は、RANDOM 関数の使用方法を説明しています。以下の出力に表示される値は、これらの例を自分で実行したときに返される値とは異なる場合があります。
次の例では、シードなしで RANDOM を呼び出します。各行の出力は異なります。
SELECT random() FROM table(generator(rowCount => 3)); +----------------------+ | RANDOM() | |----------------------| | -962378740685764490 | | 2115408279841266588 | | -3473099493125344079 | +----------------------+
次の例では、各行に同じシードを使用して RANDOM を呼び出します。シードは定数ですが、各行の出力は依然として異なります。
SELECT random(4711) FROM table(generator(rowCount => 3)); +----------------------+ | RANDOM(4711) | |----------------------| | -3581185414942383166 | | 1570543588041465562 | | -6684111782596764647 | +----------------------+
次の例では、1つのステートメント内で RANDOM を複数回呼び出し、シードは使用していません。RANDOM は、各行内で異なる値を返し、異なる行にも異なる値を返します。
SELECT random(), random() FROM table(generator(rowCount => 3)); +----------------------+----------------------+ | RANDOM() | RANDOM() | |----------------------+----------------------| | 3150854865719208303 | -5331309978450480587 | | -8117961043441270292 | 738998101727879972 | | 6683692108700370630 | 7526520486590420231 | +----------------------+----------------------+
次の例では、1つのステートメント内で RANDOM を複数回呼び出し、それらの呼び出しごとに同じシードを使用します。RANDOM は、各行 内 に同じ値を返しますが、異なる行には異なる値を返します。
SELECT random(4711), random(4711) FROM table(generator(rowCount => 3)); +----------------------+----------------------+ | RANDOM(4711) | RANDOM(4711) | |----------------------+----------------------| | -3581185414942383166 | -3581185414942383166 | | 1570543588041465562 | 1570543588041465562 | | -6684111782596764647 | -6684111782596764647 | +----------------------+----------------------+