类别:

数据生成函数

RANDOM

每次调用都会返回一个伪随机 64 位整数。

语法

RANDOM([seed])
Copy

实参

可选:

seed

种子是整数。不同的种子导致 RANDOM 生成不同的输出值。

如果未提供种子,则以特定于平台的方式选择随机数种子。

使用说明

  • 如果 SQL 语句对每行使用相同的种子调用 RANDOM,则 RANDOM 会对每行返回不同的值,即使种子相同也是如此。

  • 如果 SQL 语句对 同一行 使用 相同种子 多次调用 RANDOM,则每次调用 RANDOM 会 对该行 返回相同的值。例如,以下调用为每行返回两次相同的值:select random(42), random(42) from table1

    请参阅 以下示例

  • 如果多次执行调用 RANDOM 的语句,则 不能保证 RANDOM 每次都会生成相同的值集。无论是否指定种子,都是如此。

    即使用相同的数据调用相同的语句,RANDOM 也可能生成不同的值。例如,这可能发生在以下情况下:

    • 工作线程数不同。

    • 行的处理顺序不同。

  • 随机值不一定是唯一值。尽管对于少量调用而言,重复的情况很少,但随着调用数量的增加,重复的几率也会增加。如果需要唯一值,请考虑使用序列 (SEQ1 / SEQ2 / SEQ4 / SEQ8),而不是调用 RANDOM。选择一个具有足够位数且不太可能被回绕的序列。

  • 由于输出是有限整数,并且值是由算法生成的,而不是真正随机生成的,因此该函数最终会“回绕”并开始重复值序列。但是,“周期”(回绕前的调用次数)非常大:2^19937 - 1。

  • 输出只是伪随机的;在给定足够信息(包括算法和种子)的情况下可以预测输出。

  • RANDOM 实施了称为 MT19937-64 的 64 位 梅森旋转 (link removed) 算法。

  • 生成伪随机数的计算成本有些高;大量调用此函数可能消耗大量资源。

示例

以下示例演示了如何使用 RANDOM 函数。以下输出中显示的值可能与您自行运行这些示例时返回的值不同。

以下示例不使用种子调用 RANDOM。每行的输出都不同。

SELECT random() FROM table(generator(rowCount => 3));

+----------------------+
|             RANDOM() |
|----------------------|
|  -962378740685764490 |
|  2115408279841266588 |
| -3473099493125344079 |
+----------------------+
Copy

以下示例对每行使用相同种子调用 RANDOM。尽管种子是常量,但每行的输出仍然不同。

SELECT random(4711) FROM table(generator(rowCount => 3));
+----------------------+
|         RANDOM(4711) |
|----------------------|
| -3581185414942383166 |
|  1570543588041465562 |
| -6684111782596764647 |
+----------------------+
Copy

以下示例在单个语句中多次调用 RANDOM,并且不使用种子。RANDOM 在每行内返回不同的值,以及对不同的行返回不同的值:

SELECT random(), random() FROM table(generator(rowCount => 3));

+----------------------+----------------------+
|             RANDOM() |             RANDOM() |
|----------------------+----------------------|
|  3150854865719208303 | -5331309978450480587 |
| -8117961043441270292 |   738998101727879972 |
|  6683692108700370630 |  7526520486590420231 |
+----------------------+----------------------+
Copy

以下示例在单个语句中多次调用 RANDOM,并且每次调用都使用相同的种子。RANDOM 在每行 返回相同的值,但对不同的行返回不同的值:

SELECT random(4711), random(4711) FROM table(generator(rowCount => 3));
+----------------------+----------------------+
|         RANDOM(4711) |         RANDOM(4711) |
|----------------------+----------------------|
| -3581185414942383166 | -3581185414942383166 |
|  1570543588041465562 |  1570543588041465562 |
| -6684111782596764647 | -6684111782596764647 |
+----------------------+----------------------+
Copy
语言: 中文