Kategorien:

Datengenerierungsfunktionen

RANDOM

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

Syntax

RANDOM([seed])

Argumente

Optional:

Startwert

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

Wenn kein Startwert angegeben ist, wird ein Plattform-spezifischer zufälliger Startwert ausgewählt.

Nutzungshinweise

  • Wenn eine SQL-Anweisung RANDOM mit demselben Startwert für jede Zeile aufruft, dann gibt RANDOM für jede Zeile einen anderen Wert zurück, obwohl der Startwert derselbe ist.

  • Wenn eine SQL-Anweisung RANDOM mehr als einmal mit dem gleichen Startwert für die gleiche Zeile aufruft, dann gibt RANDOM bei jedem Aufruf für diese Zeile den gleichen Wert zurück. Im Folgenden wird z. B. zweimal derselbe Wert für jede Zeile zurückgegeben: select random(42), random(42) from table1.

    Siehe die Beispiele unten.

  • Wenn eine Anweisung, die RANDOM aufruft, mehr als einmal ausgeführt wird, gibt es keine Garantie, dass RANDOM jedes Mal denselben Satz von Werten generiert. Dies gilt unabhängig davon, ob Sie einen Startwert angeben oder nicht.

    Auch wenn die gleiche Anweisung mit den gleichen Daten aufgerufen wird, kann RANDOM unterschiedliche Werte generieren. Dies kann zum Beispiel in folgenden Fällen auftreten:

    • Die Anzahl der Mitarbeiter-Threads ist unterschiedlich.

    • Die Zeilen werden in einer anderen Reihenfolge verarbeitet.

  • 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

In den folgenden Beispielen wird die Verwendung der Funktion RANDOM() gezeigt. Die in der Ausgabe unten angezeigten Werte können sich von den Werten unterscheiden, die zurückgegeben werden, wenn Sie diese Beispiele selbst ausführen.

Im folgende Beispiel wird RANDOM ohne Startwert aufgerufen: Die Ausgabe für jede Zeile ist unterschiedlich.

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

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

Im folgenden Beispiel wird RANDOM mit demselben Startwert für jede Zeile aufgerufen. Obwohl der Startwert eine Konstante ist, ist die Ausgabe für jede Zeile trotzdem unterschiedlich.

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

Im folgenden Beispiel wird RANDOM mehrfach innerhalb einer einzigen Anweisung und ohne Verwendung eines Startwerts aufgerufen. RANDOM gibt sowohl innerhalb jeder Zeile als auch bei verschiedenen Zeilen unterschiedliche Werte zurück:

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

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

Im folgenden Beispiel wird RANDOM mehrfach innerhalb einer einzigen Anweisung aufgerufen, wobei für jeden Aufruf derselbe Startwert verwendet wird. RANDOM gibt innerhalb jeder Zeile den gleichen Wert zurück, aber unterschiedliche Werte für verschiedene Zeilen:

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