Kategorien:

Datengenerierungsfunktionen

RANDOM

Jeder Aufruf gibt eine pseudozufällige 64-Bit-Ganzzahl zurück.

Syntax

RANDOM([seed])

Argumente

Startwert

Der Startwert ist eine ganze Zahl. Bei unterschiedlichen Startwerten erzeugt RANDOM unterschiedliche Ausgabewerte.

Nutzungshinweise

  • Das optionale Startwert-Argument muss eine Ganzzahlkonstante sein. Wenn für Startwert kein Wert angegeben ist, wird je nach Plattform ein zufälliger Startwert ausgewählt.

  • Das wiederholte Aufrufen von RANDOM ohne Startwert erzeugt für jeden Aufruf einen anderen Wert, sowohl innerhalb einer Zeile als auch zwischen Zeilen.

  • Wenn Sie RANDOM wiederholt mit dem gleichen Startwert aufrufen, wird für eine gegebene Eingabezeile jedes Mal der gleiche Wert ausgegeben. Unterschiedliche Zeilen in der Ausgabe haben jedoch unterschiedliche Werte.

  • Zufällige Werte sind keine eindeutigen Werte. Obwohl Duplikate bei einer geringen Anzahl von Aufrufen selten sind, steigt die Wahrscheinlichkeit von Duplikaten mit steigender Anzahl von Aufrufen. Wenn Sie eindeutige Werte benötigen, müssen Sie anstelle des Aufrufs von RANDOM eine Sequenz (SEQ1 / SEQ2 / SEQ4 / SEQ8) verwenden. Wählen Sie eine Sequenz mit genügend Bits aus, damit die Wahrscheinlichkeit, dass die Sequenz von vorn beginnt, gering bleibt.

  • Da die Ausgabe eine endliche Ganzzahl ist und die Werte eher von einem Algorithmus als von einem Zufallsgenerator generiert werden, schlägt die Funktion schließlich um und beginnt, Sequenzen von Werten zu wiederholen. Die „Periode“ (Anzahl der Aufrufe vor dem Umschlagen) ist jedoch sehr groß: 2^19937 - 1.

  • Die Ausgabe ist nur pseudozufällig. Sie kann vorhergesagt werden, wenn genügend Informationen vorliegen (einschließlich Algorithmus und Startwert).

  • RANDOM implementiert einen 64-Bit-Mersenne-Twister-Algorithmus, der als MT19937-64 bekannt ist.

  • Die Generierung von Pseudozufallszahlen ist rechnerisch aufwendig. Eine große Anzahl von Aufrufen für diese Funktion kann erhebliche Ressourcen in Anspruch nehmen.

Beispiele

Normalerweise wird RANDOM ohne Startwert verwendet. Die meisten dieser Beispiele verwenden jedoch einen Startwert, sodass die Kunden, die diese Befehle ausführen, dieselben Werte erhalten, die in der Dokumentation angegeben sind:

Hier ist ein einfaches Beispiel für den Aufruf von RANDOM mit einem Startwert:

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

Die folgenden Beispiele zeigen, dass Sie für eine einzelne Zeile bei Verwendung desselben Startwerts immer denselben Wert erhalten:

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 |
+---------------------+

Dies zeigt, dass bei einem mehrmaligen Aufruf von RANDOM(<Startwert>) innerhalb derselben Ausführung einer Anweisung jede Zeile für jeden RANDOM-Aufruf denselben Wert erhält, aber unterschiedliche Zeilen unterschiedliche Werte erhalten:

Erstellen Sie zunächst die Tabelle, und fügen Sie einige Werte ein.

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);

Ersetzen Sie diese Werte durch Werte, die durch Aufrufen von RANDOM(<Startwert>) generiert wurden.

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

Zeigen Sie die Werte an. Beachten Sie, dass in einer Zeile alle von RANDOM generierten Werte gleich sind, die Werte in unterschiedlichen Zeilen jedoch unterschiedlich sind:

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

Beachten Sie, dass ohne Übergabe eines Startwerts die Werte innerhalb jeder Zeile sowie zwischen den Zeilen unterschiedlich sind.