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