Nachdem ich ein bisschen gegoogelt hatte, konnte ich keine einfache Möglichkeit finden, mit einem Shell-Befehl eine zufällige dezimale Ganzzahl zu generieren, die in einem bestimmten Bereich zwischen einem Minimum und einem Maximum liegt.
Ich habe gelesen /dev/random
, /dev/urandom
und $RANDOM
, aber keiner von ihnen kann tun , was ich brauche.
Gibt es einen anderen nützlichen Befehl oder eine Möglichkeit, die vorherigen Daten zu verwenden?
shell
command-line
command
random
BowPark
quelle
quelle
Antworten:
Im POSIX-Toolchest können Sie Folgendes verwenden
awk
:Verwenden Sie dies beispielsweise nicht als Quelle zum Generieren von Kennwörtern oder geheimen Daten, da bei den meisten
awk
Implementierungen die Anzahl anhand des Zeitpunkts, zu dem der Befehl ausgeführt wurde, leicht geschätzt werden kann.Bei vielen
awk
Implementierungen gibt dieser Befehl, der zweimal in derselben Sekunde ausgeführt wird, im Allgemeinen dieselbe Ausgabe aus.quelle
x=$(awk -v min=$min_var -v max=$max_var 'BEGIN{srand(); printf("%.2d", int(min+rand()*(max-min+1)))}')
awk -v min=5 -v max=10 -v seed="$(od -An -N4 -tu4 /dev/urandom)" 'BEGIN{srand(seed+0); print int(min+rand()*(max-min+1))}'
. Sie könnten$RANDOM
anstelle von verwenden,od ... /dev/random
aber dann liegt Ihr Startwert im relativ kleinen Bereich von 0 bis 32767, und Sie werden wahrscheinlich im Laufe der Zeit spürbare Wiederholungen in Ihrer Ausgabe erhalten.Sie können es mit
shuf
GNU coreutils versuchen :quelle
shuf
.jot
Unter BSD und OSX können Sie jot verwenden , um eine einzelne Zufallszahl (
-r
) aus dem Intervallmin
bismax
einschließlich zurückzugeben.Verteilungsproblem
Unglücklicherweise wird der Bereich und die Verteilung zufällig generierter Zahlen durch die Tatsache beeinflusst, dass jot intern Gleitkomma-Arithmetik mit doppelter Genauigkeit und printf (3) für das Ausgabeformat verwendet, was zu Rundungs- und Kürzungsproblemen führt. Daher werden die Intervalle
min
undmax
weniger häufig generiert, wie gezeigt:Unter OS X 10.11 (El Capitan) scheint dies behoben worden zu sein:
und...
Lösen des Verteilungsproblems
Für ältere Versionen von OS X gibt es glücklicherweise mehrere Problemumgehungen. Eine besteht darin, die Ganzzahlkonvertierung printf (3) zu verwenden. Die einzige Einschränkung ist, dass das Intervallmaximum jetzt wird
max+1
. Durch die Verwendung der Ganzzahlformatierung erhalten wir eine gerechte Verteilung über das gesamte Intervall:Die perfekte Lösung
Um einen fairen Würfelwurf mit dem Workaround zu erzielen, haben wir:
Zusätzliche Hausaufgaben
In jot (1) finden Sie ausführliche Informationen zu Mathematik und Formatierung sowie viele weitere Beispiele.
quelle
Die
$RANDOM
Variable ist normalerweise kein guter Weg, um gute Zufallswerte zu generieren. Die Ausgabe von/dev/[u]random
muss auch zuerst konvertiert werden.Eine einfachere Möglichkeit ist die Verwendung von höheren Sprachen, wie z. B. Python:
Verwenden Sie, um eine zufällige Ganzzahlvariable zwischen 5 und 10 (5 <= N <= 10) zu generieren
Verwenden Sie dies nicht für kryptografische Anwendungen.
quelle
Sie können die Zufallszahl durch bekommen
urandom
head -200 /dev/urandom | cksum
Ausgabe:
3310670062 52870
So rufen Sie den einen Teil der obigen Nummer ab.
head -200 /dev/urandom | cksum | cut -f1 -d " "
Dann ist die Ausgabe
3310670062
quelle
head -200
(oder sein POSIX-Äquivalenthead -n 100
) gibt die ersten 200 Zeilen von zurück/dev/urandom
./dev/urandom
Ist keine Textdatei, kann dieser Befehl von 200 Byte (alle 0x0a, LF in ASCII) bis unendlich (wenn das 0xa-Byte nie zurückgegeben wird) zurückgegeben werden, aber Werte zwischen 45k und 55k sind am wahrscheinlichsten. cksum gibt eine 32-Bit-Zahl zurück, daher ist es sinnlos, mehr als 4 Bytes abzurufen/dev/urandom
.Verwenden Sie, um eine zufällige Ganzzahlvariable zwischen 5 und 10 (einschließlich beider) zu generieren
%
arbeitet als Modulo-Operator.Es gibt wahrscheinlich bessere Möglichkeiten, die Zufallsvariable
$RANDOM
in einen bestimmten Bereich umzuwandeln . Verwenden Sie dies nicht für kryptografische Anwendungen oder in Fällen, in denen Sie echte, gleichverteilte Zufallsvariablen benötigen (wie für Simulationen).quelle
# echo $(( $RANDOM % 256 ))
erzeugt eine "zufällige" Zahl zwischen 0 und 255 in modernen * sh Dialekten.quelle
Vielleicht kann die
UUID
(unter Linux) verwendet werden, um die Zufallszahl abzurufenUm die Zufallszahl zwischen
70
und zu erhalten100
quelle
Dadurch wird eine 8-stellige Hexadezimalzahl generiert.
quelle
Um vollständig in bash zu bleiben und die Variable $ RANDOM zu verwenden, aber die ungleichmäßige Verteilung zu vermeiden:
Dieses Beispiel würde Zufallszahlen von 20 bis 29 liefern.
quelle
$r
sollte auf 65535 oder einen anderen hohen Wert initialisiert werden, um einen[: -lt: unary operator expected
Fehler zu vermeiden .Verteilung ist gut:
für ((i = 1; i <= 100000; i ++)) mache ein Echo von $ ((RANDOM% (20 - 10 + 1) + 10)); fertig | sort -n | uniq -c
Zählwert
9183 10
9109 11
8915 12
9037 13
9100 14
9138 15
9125 16
9261 17
9088 18
8996 19
9048 20
quelle