Ich versuche, ein zufälliges n
Buchstabenwort zu drucken , das ich n
über die Befehlszeile selbst eingebe, aber aus irgendeinem Grund gibt mir mein Skript jedes Mal die gleiche Antwort, wenn ich den gleichen Wert für verwende n
.
#!/bin/bash
num=$1
egrep "^.{$num}$" /usr/share/dict/words | head -n $RANDOM| tail -n 1
Ich rufe mein Skript wie folgt auf:
$ bash var3.sh 5
étude # always the same output when using 5
$ bash var3.sh 3
zoo # always the same output when using 3
Wo var3.sh
ist der Name meines Skripts und 5 ist die Länge des Wortes, das ich zufällig drucken möchte.
Wie kann ich ein wirklich zufälliges Wort drucken?
$RANDOM
ist ziemlich wahrscheinlich größer als die Anzahl der n- Buchstaben-Wörter für die meisten Werte von n (95,7% der Zeit für n = 3 für mich).shuf
odersort -R
wie in den Antworten vorgeschlagen zu verwenden. Sie können auch verwenden$RANDOM
, jedoch auf fortgeschrittenere Weise. Alle diese Tools liefern vorhersagbare Ergebnisse (sie sind nicht wirklich zufällig), aber sie sind schnell und für viele Zwecke gut genug.Antworten:
Das tut es nicht. Aber $ RANDOM gibt große Zahlen zurück (zwischen 0 und 32767), die insbesondere für Wörter mit begrenzter Länge das gleiche Ergebnis zeigen, da der
head
Teil wahrscheinlich alle Ergebnisse des grep zurückgibt (für 3 gibt es nur 819 Übereinstimmungen in meinem/usr/share/dict/words
).Eine bessere Lösung könnte darin bestehen, die Ergebnisse zu mischen:
egrep "^.{$num}$" /usr/share/dict/words | sort -R | tail -n 1
wo
-R
bedeutet--random-sort
(eine GNU-sort
Erweiterung).quelle
tail
? Das machte im OP-Skript Sinn, aber da Sie mischen, können Sie es auch verwendenhead
undsort
sollten dann in der Lage sein, das gebrochene Rohr zu erkennen und sich nicht die Mühe zu machen, den Rest der Zeilen zu mischen.shuf -n1
, was eine Pfeife weniger ist ...Eine einfache Methode , eine beliebige ausdrucken num - Bf Word verwendet
shuf
:Der
shuf
Befehl gibt eine zufällige Permutation der Eingabe aus, und das-n1
Flag weist ihn an, nur das erste Element aus diesem Ergebnis auszugeben.quelle
grep -Ex ".{$num}"
. Oderawk 'length == n' n="$num"'
.Wie andere bereits betont haben, besteht das Hauptproblem bei Ihrem Code darin, dass der
$RANDOM
Wert häufig viel größer ist als die Anzahl der Wörter einer bestimmten Länge.Mit
awk
nur:Das Programm liest alle Zeilen aus der angegebenen Datei ein, die eine bestimmte Länge haben. Diese werden im Array gespeichert
words
.Am Ende wird ein zufälliges Element aus diesem Array ausgewählt und gedruckt.
quelle