So setzen Sie eine Variable mit bash auf einen zufälligen Wert

14

In einem Programm muss eine Variable auf einen zufälligen Wert von 0 oder 1 gesetzt werden.

Ich kann nicht herausfinden, wie es geht, und Google hat mich im Stich gelassen.

cheesits456
quelle

Antworten:

30

Eine einfache Methode besteht darin $RANDOM, eine pseudozufällige 16-Bit-Ganzzahl im Bereich [0; 32767]. Sie können das einfach in [0; 1] durch Berechnung von Modulo 2 der Zufallszahl:

echo $(( $RANDOM % 2 ))

Weitere Informationen zu Bashs $RANDOM: http://www.tldp.org/LDP/abs/html/randomvar.html

Mit diesem einfachen Konstrukt können Sie einfach leistungsstarke Skripte mit Zufälligkeit erstellen, wie in diesem Comic ...

Commit Strip - Russisches Roulette

Byte Commander
quelle
4
Der Pedant in mir fühlt sich die Notwendigkeit , darauf hinzuweisen , dass der gewählte Produktionsserver Befehl zerstört wird nichts tun , ohne --no-preserve-root- so vielleicht nicht das Spiel der russischen Roulette sie sich erhofft haben ...
Boris die Spinne
2
@ BoristheSpider sie verwenden die antiquierte $[]Syntax - wer weiß, ob rmsie diese --no-preserve-rootFunktion hatten?
muru
10
@BoristheSpider Meine Interpretation des Comics ist, dass sie, wenn sie die Nachricht sehen rm: it is dangerous to operate recursively on '/' rm: use --no-preserve-root to override this failsafe, den Kopf hängen und, da sie wissen, dass sie das Spiel verloren haben, fortfahren, ihre Festplatte ddaus Ehre zu löschen .
Eliah Kagan
@EliahKagan ah, seppuku. Verstanden.
Boris die Spinne
@BoristheSpider: Das --no-preserve-rootwurde erst "in letzter Zeit" implementiert. Habe keine Informationen darüber, wann es implementiert wurde, aber das IIRC ist erst ein paar Jahre alt. Und das ist eine winzige Menge, wenn es um Linux geht. Hier ist ein Ticket dazu: bugs.launchpad.net/ubuntu/+source/coreutils/+bug/174283
Apache
13

Du könntest benutzen shuf

DESCRIPTION
     Write a random permutation of the input lines to standard output.

     -i, --input-range=LO-HI
            treat each number LO through HI as an input line
     -n, --head-count=COUNT
            output at most COUNT lines

Beispiel:

$ foo=$(shuf -i0-1 -n1)
$ echo $foo
1
$ foo=$(shuf -i0-1 -n1)
$ echo $foo
0
$ foo=$(shuf -i0-1 -n1)
$ echo $foo
0
$ foo=$(shuf -i0-1 -n1)
$ echo $foo
1
Zanna
quelle
5

Wie wäre es mit:

#!/bin/bash
r=$(($RANDOM % 2))
echo $r

Oder auch:

r=$(($(od -An -N1 -i /dev/random) % 2))

Oder vielleicht:

r=$(seq 0 1 | sort -R  | head -n 1)

Oder hackiger:

r=$(($(head -128 /dev/urandom | cksum | cut -c1-10) % 2))

Und auch:

r=$(apg -a 1 -M n -n 1 -m 8 -E 23456789  | cut -c1)

Ebenso gut wie:

r=$((0x$(cut -c1-1 /proc/sys/kernel/random/uuid) % 2))
Colin Ian King
quelle
1

Dieses Skript hat keine Vorteile gegenüber vorhandenen Antworten. Nur zur Unterhaltung ...

Holen Sie sich ein Byte von /dev/urandom(obwohl es im Allgemeinen nicht empfohlen wird, beliebige Binärzeichen an die Konsole zu senden, da dies zu unerwarteten / verwirrenden Ergebnissen führen kann):

head -c 1 /dev/urandom

Und in eine Dezimalzahl umwandeln:

head -c 1 /dev/urandom | od -An -t u1

Und den Rest der Division durch 2 erhalten:

echo $((`head -c 1 /dev/urandom | od -An -t u1` % 2))
Sasha
quelle