
Ich habe den folgenden Befehl ausgeführt, um 1 Milliarde Zufallszahlen zu generieren:
time shuf -i 1-1000000000 > "SHUF TEST 1"
Zu meiner Überraschung war dies in weniger als 10 Minuten erledigt. Dann ließ ich die Ausgabedatei durchlaufen, uniq -d
um zu ermitteln, wie viele der generierten Zahlen doppelt waren, und war erneut überrascht, als sich herausstellte, dass es 0 waren. Ich ließ die Ausgabedatei ebenfalls durchlaufen, uniq -u
um sort -u
diese Ergebnisse zu bestätigen.
Wie shuf
kann der Befehl in so relativ kurzer Zeit eine Milliarde Zufallszahlen generieren und kann ich mich auf seine Zufälligkeit verlassen? Beachten Sie, dass ich für meine Zwecke keinen kryptografisch sicheren Zufallszahlengenerator benötige, sondern nur etwas, das gut genug ist, um immer eine eindeutige Zahl zurückzugeben.
Antwort1
Das shuf
Dienstprogramm mischt seine Eingabe, indem es eine zufällige Permutation seiner Eingabezeilen ausgibt. Laut der Manpage ist „jede Ausgabepermutation gleich wahrscheinlich“. Eine Analogie wäre das Mischen eines Kartenspiels.
Wenn die Eingabezeilen Duplikate enthalten, shuf
enthält auch die Ausgabe von Duplikate. Warum? Weil es shuf
eine zufällige Permutation seiner Eingabe durchführt. Wenn die Eingabezeilen keine Duplikate enthalten, shuf
enthält die Ausgabe von auch keine Duplikate.
In Ihrem Beispiel bewirkt die Option shuf -i 1-1000000000
, dass die Eingabe so erfolgt, als käme sie aus einer Datei, die den Bereich vorzeichenloser Dezimalzahlen von 1 bis 1000000000 enthält, also eine vorzeichenlose Ganzzahl pro Zeile. Mit anderen Worten: Die Option verhält sich so, als hätte sie 1000000000 Zeilen Eingabe, wobei jede Zeile eine eindeutige vorzeichenlose Ganzzahl enthält. Daher sind in der Ausgabe keine Duplikate zu finden.-i
shuf
shuf