Categorias:

Funções de geração de dados

RANDOM

Cada chamada retorna um número inteiro pseudoaleatório de 64 bits.

Sintaxe

RANDOM([seed])
Copy

Argumentos

Opcional:

seed

A semente é um número inteiro. Sementes diferentes fazem com que RANDOM produza valores de saída diferentes.

Se nenhuma semente for fornecida, uma semente aleatória é escolhida de uma maneira específica da plataforma.

Notas de uso

  • Se uma instrução SQL chamar RANDOM com a mesma semente para cada linha, então RANDOM retornará um valor diferente para cada linha, mesmo que a semente seja a mesma.

  • Se uma instrução SQL chamar RANDOM mais de uma vez com a mesma semente para a mesma linha, então RANDOM retornará o mesmo valor para cada chamada daquela linha. Por exemplo, o seguinte retorna o mesmo valor duas vezes para cada linha: select random(42), random(42) from table1.

    Consulte o exemplo abaixo.

  • Se uma instrução que chama RANDOM for executada mais de uma vez, não há garantia de que RANDOM irá gerar o mesmo conjunto de valores a cada vez. Isso se aplica independentemente de você especificar ou não uma semente.

    Mesmo que a mesma instrução seja chamada com os mesmos dados, RANDOM pode produzir valores diferentes. Por exemplo, isso pode ocorrer quando:

    • O número de threads de trabalho é diferente.

    • As linhas são processadas em uma ordem diferente.

  • Os valores aleatórios não são necessariamente valores únicos. Embora as duplicatas sejam raras para um pequeno número de chamadas, as chances de duplicatas aumentam conforme o número de chamadas aumenta. Se você precisar de valores únicos, considere o uso de uma sequência (SEQ1 / SEQ2 / SEQ4 / SEQ8) em vez de uma chamada para RANDOM. Escolha uma sequência com bits suficientes para que a probabilidade de a sequência começar do início seja baixa.

  • Como a saída é um inteiro finito e os valores são gerados por um algoritmo e não de forma verdadeiramente aleatória, a função eventualmente é iniciada novamente e começa a repetir sequências de valores. Entretanto, o “período” (número de chamadas antes de começar do início) é extremamente grande: 2^19937 - 1.

  • A saída é apenas pseudoaleatória; a saída pode ser prevista com informações suficientes (incluindo o algoritmo e a semente).

  • RANDOM implementa um algoritmo de 64 bits Mersenne twister conhecido como MT19937-64.

  • Gerar números pseudoaleatórios é algo caro em termos computacionais; um grande número de chamadas para esta função pode consumir recursos significativos.

Exemplos

Os exemplos a seguir demonstram como utilizar a função RANDOM. Os valores exibidos na saída abaixo podem diferir dos valores retornados quando você mesmo executa estes exemplos.

O seguinte exemplo chama RANDOM sem uma semente. A saída para cada linha é diferente.

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

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

O exemplo seguinte chama RANDOM com a mesma semente para cada linha. Embora a semente seja uma constante, a saída para cada linha ainda é diferente.

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

O exemplo seguinte chama RANDOM várias vezes dentro de uma única instrução e não utiliza uma semente. RANDOM retorna valores diferentes dentro de cada linha, bem como valores diferentes para filas diferentes:

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

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

O exemplo seguinte chama RANDOM várias vezes dentro de uma única instrução e usa a mesma semente para cada uma dessas chamadas. RANDOM retorna o mesmo valor dentro de cada linha, mas valores diferentes para linhas diferentes:

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