n
コマンドライン自体から入力したランダムな文字単語を印刷しようとしていますが、何らかのn
理由で私のスクリプトは毎回同じ値で同じ答えを提供しますn
。
#!/bin/bash
num=$1
egrep "^.{$num}$" /usr/share/dict/words | head -n $RANDOM| tail -n 1
私は次のようにスクリプトを呼び出します。
$ bash var3.sh 5
étude # always the same output when using 5
$ bash var3.sh 3
zoo # always the same output when using 3
私のスクリプトの名前はどこにvar3.sh
あり、5はランダムに印刷したい単語の長さです。
本当にランダムな単語を印刷するにはどうすればよいですか?
答え1
しかし、実際にはそうではありません。ただし、$RANDOM は特に制限された長さの単語に対して大きな数字 (0 ~ 32767) を返し、その部分が grep のすべての結果を返すことができるのと同じ結果を表示しますhead
(3 の場合 my に 819 の一致のみあり/usr/share/dict/words
)。
より良い解決策は結果を混ぜることです。
egrep "^.{$num}$" /usr/share/dict/words | sort -R | tail -n 1
これは(GNU拡張)を-R
意味します。--random-sort
sort
答え2
欲しいものを印刷する簡単な方法シリアル番号- アルファベットの単語の使用shuf
:
egrep "^.{$num}$" /usr/share/dict | shuf -n1
このshuf
コマンドは入力のランダムな順列を出力し、この-n1
フラグはその結果の最初の項目のみを出力するように指示します。
答え3
他の人が指摘したように、コードの主な問題は、多くの場合、値が特定の長さの単語$RANDOM
数よりはるかに大きいことです。
以下のみを使用してくださいawk
。
$ awk -v len="$num" 'length == len { word[i++]=$0 }
END { print word[int(i*rand())] }' /usr/share/dict/words
Bosniac
このプログラムは、指定されたファイルから特定の長さのすべての行を読み取ります。これらは配列に保存されますwords
。
最後に、この配列から任意の要素を選択して印刷します。