509 Stimmen

Wie erzeugt man eine Zufallszahl in der Bash?

Wie generiert man in der Bash eine Zufallszahl innerhalb eines Bereichs?

7voto

Janusz Punkte 181894

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

6voto

Reine Bash-Zufallszahl ohne moduloing

lowerRange=10   # inclusive
upperRange=20   # exclusive

randomNumber=$(( RANDOM * ( upperRange - lowerRange) / 32767 + lowerRange ))

6voto

Vinicius Placco Punkte 1633

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.

6voto

4pie0 Punkte 28313

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 ))

6voto

k-h Punkte 346

Worüber?

perl -e 'print int rand 10, "\n"; '

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X