509 Stimmen

Wie erzeugt man eine Zufallszahl in der Bash?

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

2voto

xerostomus Punkte 356

Zufällige Verzweigung eines Programms oder ja/nein; 1/0; wahr/falsch Ausgabe:

if [ $RANDOM -gt 16383  ]; then              # 16383 = 32767/2 
    echo var=true/1/yes/go_hither
else 
    echo var=false/0/no/go_thither
fi

wenn Sie sich nicht mehr an 16383 erinnern können:

if (( RANDOM % 2 )); then 
    echo "yes"
else 
    echo "no"
fi

2voto

Yzmir Ramirez Punkte 1271

Ich wollte /dev/urandom ohne dd y od

function roll() { local modulus=${1:-6}; echo $(( 1 + 0x$(env LC_CTYPE=C tr -dc '0-9a-fA-F' < /dev/urandom | head -c5 ) % $modulus )); }

Prüfung

$ roll
5
$ roll 12
12

Wie zufällig ist das?

$ (echo "count roll percentage"; i=0; while [ $i -lt 10000 ]; do roll; i=$((i+1)); done | sort | uniq -c | awk '{print $0,($1/10000*100)"%"}') | column -t
count  roll  percentage
1625   1     16.25%
1665   2     16.65%
1646   3     16.46%
1720   4     17.2%
1694   5     16.94%
1650   6     16.5%

2voto

johntellsall Punkte 13067

Generieren einer zufälligen 3-stelligen Zahl

Dies eignet sich hervorragend zur Erstellung von Beispieldaten. Beispiel: Legen Sie alle Testdaten in einem Verzeichnis mit dem Namen "test-create-volume-123" ab, und zappen Sie nach Abschluss des Tests das gesamte Verzeichnis. Wenn Sie genau drei Ziffern erzeugen, müssen Sie nicht Seltsame Sortierprobleme .

printf '%02d\n' $((1 + RANDOM % 100))

Diese skaliert nach unten, z. B. auf eine Ziffer:

printf '%01d\n' $((1 + RANDOM % 10))

Sie skaliert nach oben, aber nur bis vier Ziffern . Siehe oben, warum :)

1voto

s1037989 Punkte 111

Eine Bash-Funktion, die mit Perl eine Zufallszahl mit n Ziffern erzeugt. Geben Sie entweder die Anzahl der Ziffern oder eine Vorlage mit n 0en an.

rand() {
  perl -E '$ARGV[0]||=""; $ARGV[0]=int($ARGV[0])||length($ARGV[0]); say join "", int(rand(9)+1)*($ARGV[0]?1:0), map { int(rand(10)) } (0..($ARGV[0]||0)-2)' $1
}

Verwendung:

$ rand 3
381
$ rand 000
728

Demonstration des Aufrufs von rand n, für n zwischen 0 und 15:

$ for n in {0..15}; do printf "%02d: %s\n" $n $(rand $n); done
00: 0
01: 3
02: 98
03: 139
04: 1712
05: 49296
06: 426697
07: 2431421
08: 82727795
09: 445682186
10: 6368501779
11: 51029574113
12: 602518591108
13: 5839716875073
14: 87572173490132
15: 546889624135868

Demonstration des Aufrufs von rand n, für n eine Schablone von 0s zwischen Länge 0 und 15

$ for n in {0..15}; do printf "%15s :%02d: %s\n" $(printf "%0${n}d" 0) $n $(rand $(printf "%0${n}d" 0)); done
              0 :00: 0
              0 :01: 0
             00 :02: 70
            000 :03: 201
           0000 :04: 9751
          00000 :05: 62237
         000000 :06: 262860
        0000000 :07: 1365194
       00000000 :08: 83953419
      000000000 :09: 838521776
     0000000000 :10: 2355011586
    00000000000 :11: 95040136057
   000000000000 :12: 511889225898
  0000000000000 :13: 7441263049018
 00000000000000 :14: 11895209107156
000000000000000 :15: 863219624761093

0voto

Shiming Punkte 16
$(((RANDOM % $((upperBound - lowerBound))) + lowerBound))

der Zufallszahlenbereich ist [lowerBound,upperBound)

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