カテゴリ:

データ生成関数

RANDOM

各呼び出しは、擬似ランダム64ビット整数を返します。

構文

RANDOM([seed])

引数

シード

シードは整数です。シードが異なると、 RANDOM は異なる出力値を生成します。

使用上の注意

  • オプションの シード 引数は整数定数でなければなりません。 シード の値が指定されていない場合、プラットフォーム固有の方法でランダムシードが選択されます。

  • シードなしで繰り返し RANDOM を呼び出すと、行内と行全体の両方で、呼び出しごとに異なる値が生成されます。

  • 特定の出力行のため同じ シード で RANDOM を繰り返し呼び出すと、毎回同じ値が生成されます。ただし、出力の異なる行には異なる値があります。

  • ランダム値は必ずしも一意の値ではありません。少数のコールでは重複はまれですが、コールの数が増えると重複の可能性は高くなります。一意の値が必要な場合は、 RANDOMの呼び出しではなく、シーケンス(SEQ1 / SEQ2 / SEQ4 / SEQ8)の使用を検討してください。ラップアラウンドの可能性が低い十分なビットのシーケンスを選択します。

  • 出力は有限の整数であり、値は真にランダムではなくアルゴリズムによって生成されるため、関数は最終的に「ラップアラウンド」し、値のシーケンスの繰り返しを開始します。ただし、「期間」(ラップする前の呼び出しの数)は非常に大きくなります。2^19937 - 1。

  • 出力は擬似ランダムのみです。十分な情報(アルゴリズムとシードを含む)が与えられると、出力を予測できます。

  • RANDOM は、MT19937-64として知られる、64ビット Mersenneツイスター アルゴリズムを実装しています。

  • 擬似乱数の生成は、計算に多少費用がかかります。この関数を大量に呼び出すと、大量のリソースが消費される可能性があります。

通常、 RANDOM はシードなしで使用されます。ただし、これらの例のほとんどはシードを使用しているため、これらのコマンドを実行する顧客はドキュメントに示されている値と同じ値を取得できます。

シードを使用して RANDOM を呼び出す簡単な例を次に示します。

SELECT random(4711) FROM table(generator(rowCount => 5));
+----------------------+
|         RANDOM(4711) |
|----------------------|
| -3581185414942383166 |
|  1570543588041465562 |
| -6684111782596764647 |
| -3878722496384921389 |
| -1136601514902083621 |
+----------------------+

これらの例は、同じシードを使用すると、個別の行に同じ値が得られることを示しています。

SELECT random(100);
+---------------------+
|         RANDOM(100) |
|---------------------|
| -707166433115721098 |
+---------------------+
SELECT random(100);
+---------------------+
|         RANDOM(100) |
|---------------------|
| -707166433115721098 |
+---------------------+
SELECT random(100);
+---------------------+
|         RANDOM(100) |
|---------------------|
| -707166433115721098 |
+---------------------+
SELECT random(100);
+---------------------+
|         RANDOM(100) |
|---------------------|
| -707166433115721098 |
+---------------------+
SELECT random(101);
+---------------------+
|         RANDOM(101) |
|---------------------|
| 1126233572059560367 |
+---------------------+
SELECT random(100);
+---------------------+
|         RANDOM(100) |
|---------------------|
| -707166433115721098 |
+---------------------+
SELECT random(101);
+---------------------+
|         RANDOM(101) |
|---------------------|
| 1126233572059560367 |
+---------------------+

これは、同じステートメントの同じ実行内で RANDOM (<シード>)を複数回呼び出すと、各行は RANDOM の呼び出しごとに同じ値を取得しますが、異なる行は異なる値を取得することを示しています。

まず、テーブルを作成し、いくつかの値を挿入します。

CREATE OR REPLACE TABLE random1 (i tinyint, j tinyint);
INSERT INTO random1 (i, j) VALUES (-1, -1);
INSERT INTO random1 (i, j) VALUES (-2, -2);

RANDOM(<シード>) の呼び出しにより、値を生成された値に置き換えます。

SET RANDOM_NUMBER_SEED = 100;
UPDATE random1 set i = RANDOM($RANDOM_NUMBER_SEED), j = RANDOM($RANDOM_NUMBER_SEED);

値を表示します。行内では、 RANDOM によって生成される値はすべて同じですが、行間では値が異なります。

SELECT i, j FROM random1;
+---------------------+---------------------+
|                   I |                   J |
|---------------------+---------------------|
| -707166433115721098 | -707166433115721098 |
| 5969071622678286091 | 5969071622678286091 |
+---------------------+---------------------+

シードを渡さない場合、値は各行 で異なり、行全体でも異なることに注意してください。