Wie generiert man in der Bash eine Zufallszahl innerhalb eines Bereichs?
Antworten
Zu viele Anzeigen?Wenn Sie ein Linux-System verwenden, können Sie eine Zufallszahl aus /dev/random oder /dev/urandom. Seien Sie vorsichtig, denn /dev/random blockiert, wenn nicht genügend Zufallszahlen vorhanden sind. Wenn Sie mehr Wert auf Geschwindigkeit als auf Zufälligkeit legen, verwenden Sie /dev/urandom.
Diese "Dateien" werden mit Zufallszahlen gefüllt, die vom Betriebssystem generiert werden. Es hängt von der Implementierung von /dev/random auf Ihrem System ab, ob Sie echte oder Pseudo-Zufallszahlen erhalten. Echte Zufallszahlen werden mit Hilfe des Rauschens erzeugt, das von Gerätetreibern wie Maus, Festplatte und Netzwerk stammt.
Sie können Zufallszahlen aus der Datei abrufen mit dd
Reine Bash-Zufallszahl ohne moduloing
lowerRange=10 # inclusive
upperRange=20 # exclusive
randomNumber=$(( RANDOM * ( upperRange - lowerRange) / 32767 + lowerRange ))
Vielleicht bin ich ein bisschen zu spät dran, aber wie wäre es mit der Verwendung von jot
eine Zufallszahl innerhalb eines Bereichs in Bash zu generieren?
jot -r -p 3 1 0 1
Dies erzeugt eine zufällige ( -r
) Zahl mit 3 Dezimalstellen Genauigkeit ( -p
). In diesem speziellen Fall erhalten Sie eine Zahl zwischen 0 und 1 ( 1 0 1
). Sie können auch sequentielle Daten drucken. Die Quelle der Zufallszahl ist laut Handbuch:
Zufallszahlen werden durch arc4random(3) ermittelt, wenn kein Seed angegeben ist, und durch random(3), wenn ein Startwert angegeben ist.
Das Lesen von /dev/random- oder /dev/urandom-Zeichendateien ist der richtige Weg.
Diese Geräte liefern beim Lesen echte Zufallszahlen und sind so konzipiert Anwendungssoftware bei der Auswahl sicherer Schlüssel für die Verschlüsselung zu helfen. Solche Zufallszahlen werden aus einem Entropie-Pool extrahiert, der durch durch verschiedene Zufallsereignisse. {LDD3, Jonathan Corbet, Alessandro Rubini, und Greg Kroah-Hartman]
Diese beiden Dateien sind die Schnittstelle zur Kernelrandomisierung, insbesondere
void get_random_bytes_arch(void* buf, int nbytes)
die wirklich zufällige Bytes aus der Hardware zieht, wenn eine solche Funktion in der Hardware implementiert ist (normalerweise ist das der Fall), oder sie zieht aus dem Entropie-Pool (bestehend aus den Zeitabständen zwischen Ereignissen wie Maus- und Tastatur-Interrupts und anderen Interrupts, die mit SA_SAMPLE_RANDOM registriert sind).
dd if=/dev/urandom count=4 bs=1 | od -t d
Dies funktioniert, schreibt aber nicht benötigte Ausgaben von dd
nach stdout. Der folgende Befehl liefert genau die ganze Zahl, die ich brauche. Ich kann sogar eine bestimmte Anzahl von Zufallsbits erhalten, indem ich die Bitmaske für die arithmetische Expansion anpasse:
me@mymachine:~/$ x=$(head -c 1 /dev/urandom > tmp && hexdump
-d tmp | head -n 1 | cut -c13-15) && echo $(( 10#$x & 127 ))