- Categorias:
RANDOM¶
Cada chamada retorna um número inteiro pseudoaleatório de 64 bits.
Sintaxe¶
RANDOM([seed])
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 | +----------------------+
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 | +----------------------+
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 | +----------------------+----------------------+
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 | +----------------------+----------------------+