Zufallszahl aus einem Bereich in einem Bash-Skript
Muss ich generieren, die eine zufällige port-Nummer zwischen 2000-65000
von einem shell-Skript. Das problem ist $RANDOM
ist ein 15-bit-Zahl, so dass ich stecken geblieben bin!
PORT=$(($RANDOM%63000+2001))
würde gut funktionieren, wenn es nicht für die Größe Begrenzung.
Hat jemand ein Beispiel, wie kann ich dies tun, vielleicht durch die Extraktion etwas von /dev/urandom
und bekommen es innerhalb einer Reihe?
InformationsquelleAutor der Frage Jason Gooner | 2010-03-31
Du musst angemeldet sein, um einen Kommentar abzugeben.
Genießen!
Bearbeiten: Der Bereich ist inklusive.
InformationsquelleAutor der Antwort leedm777
Unter Mac OS X und FreeBSD können Sie auch notieren:
InformationsquelleAutor der Antwort errno
Gemäß der bash-Manpage,
$RANDOM
verteilt zwischen 0 und 32767; das heißt, es ist ein vorzeichenloses 15-bit-Wert. Vorausgesetzt$RANDOM
gleichmäßig verteilt, können Sie eine gleichmäßig verteilte unsigned 30-bit-integer, wie folgt:Da Ihre range ist nicht eine Potenz von 2 ist, eine einfache modulo-operation wird nur fast geben Sie eine gleichmäßige Verteilung, aber mit einer 30-bit-Eingangs-Bereich und einem weniger-als-16-bit-Leistungsbereich, wie Sie in Ihrem Fall, sollte dies wirklich nah genug sein:
InformationsquelleAutor der Antwort Jesin
und hier ist man mit Python
und man mit awk
InformationsquelleAutor der Antwort ghostdog74
Den einfachsten Allgemeinen Weg, der mir einfällt, ist ein perl-one-liner:
Konnte man immer nur zwei zahlen:
Haben Sie immer noch, um Clips zu Ihrem Angebot. Es ist nicht eine Allgemeine n-bit-Zufallszahl-Methode, aber es werden arbeiten für Ihren Fall, und es ist alles in bash.
Wenn Sie wollen, um wirklich Niedlich und Lesen aus /dev/urandom, Sie könnten dies tun:
Werde, dass Lesen von zwei bytes und drucken Sie Sie als unsigned int; Sie noch zu tun haben, Ihre clipping.
InformationsquelleAutor der Antwort Cascabel
Ist hier eine andere. Ich dachte, es würde funktionieren auf fast alles, aber Sortieren ist random-option ist nicht verfügbar auf meinem centos-box bei der Arbeit.
InformationsquelleAutor der Antwort valadil
$RANDOM
ist eine Zahl zwischen 0 und 32767. Sie möchten einen port zwischen 2000 und 65000. Diese sind 63001 mögliche Anschlüsse. Wenn man sich auf die Werte der$RANDOM + 2000
zwischen 2000 und 33500wir decken einen Bereich von 31501-ports. Wenn wir eine Münze werfen und dann bedingt hinzufügen 31501 zu dem Ergebnis, wir können mehr ports, von D-33501 zu 65001. Wenn wir dann nur drop-65001, bekommen wir die genaue Reichweite benötigt, mit einer einheitlichen Wahrscheinlichkeitsverteilung für alle ports, so scheint es.Testen
InformationsquelleAutor der Antwort Renato Silva
Wenn Sie nicht gerade ein bash-Experte und waren auf der Suche, um diese in eine variable in einer Linux-basierten bash-Skript, versuchen Sie dies:
VAR=$(shuf -i 200-700 -n 1)
Bekommt Sie die Reichweite von 200 bis 700 in
$VAR
inklusive.InformationsquelleAutor der Antwort Berto
Bash-Dokumentation sagt , dass jedes mal, wenn
$RANDOM
verwiesen wird, wird eine zufällige Zahl zwischen 0 und 32767) zurückgegeben. Wenn wir die Summe in zwei aufeinanderfolgenden Referenzen, erhalten wir Werte von 0 bis 65534, die deckt den gewünschten Bereich des 63001 Möglichkeiten für eine zufällige Zahl zwischen 2000 und 65000.Zu justieren, um den genauen Bereich, verwenden wir die Summe modulo-63001, was gibt uns einen Wert von 0 bis 63000. Dies wiederum muss nur eine Schrittweite von 2000 um die gewünschte Zufallszahl, die zwischen 2000 und 65000. Diese können wie folgt zusammengefasst werden:
Testen
Richtigkeit der Berechnung
Hier ist eine vollständige, brute-force test für die Richtigkeit der Berechnung. Dieses Programm versucht zu erzeugen 63001 verschiedene Möglichkeiten, nach dem Zufallsprinzip, mit der Berechnung, unter test. Die
--jobs
parameter sollte es schneller laufen, aber es ist nicht deterministisch (Summe der Möglichkeiten generiert werden kann, der niedriger als 63001).Für die Bestimmung, wie viele Iterationen sind nötig, um einen gegebenen Wahrscheinlichkeit
p/q
alle 63001 Möglichkeiten wurden erzeugt, ich glaube, wir können den Ausdruck unten. Zum Beispiel, hier ist die Berechnung einer Wahrscheinlichkeit größer als 1/2und hier für größer als 9/10.InformationsquelleAutor der Antwort
Können Sie dies tun,
Wenn du mehr details sehen Shell-Script Für Random Number Generator.
InformationsquelleAutor der Antwort New Exit
Oder auf OS-X, der folgende arbeiten für mich:
InformationsquelleAutor der Antwort Chadwick Boggs
Gleiche mit ruby:
InformationsquelleAutor der Antwort Lev Lukomsky
PORT=$(($RANDOM%63000+2001))
ist in der Nähe, was Sie wollen, denke ich.PORT=$(($RANDOM$RANDOM$RANDOM%63000+2001))
bekommt um die Größe, die Begrenzung, die Probleme die Sie. Da bash macht keine Unterschiede zwischen einer Zahl-variable und eine string-variable, dies funktioniert bestens. Die "Anzahl"$RANDOM
können verkettet werden, wie ein string, und dann als eine Zahl in einer Berechnung. Erstaunlich!InformationsquelleAutor der Antwort Wastrel
Können Sie die Zufallszahl durch
urandom
head -200 /dev/urandom | cksum
Ausgabe:
3310670062 52870
Abrufen, die einen Teil der oben genannten Nummer.
head -200 /dev/urandom | cksum | cut -f1 -d " "
Dann wird der Ausgang
3310670062
Um Ihre Anforderung zu erfüllen,
head -200 /dev/urandom |cksum | cut -f1 -d " " | awk '{print $1%63000+2001}'
InformationsquelleAutor der Antwort zangw
Dies ist, wie ich in der Regel generieren von Zufallszahlen. Dann benutze ich "NUM_1" als variable für den port-Nummer, die ich verwenden. Hier ist ein kurzer Beispiel-Skript.
InformationsquelleAutor der Antwort Yokai