私のスクリプトは$ RANDOMを使用すると同じ出力を生成します。

私のスクリプトは$ RANDOMを使用すると同じ出力を生成します。

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

答え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

最後に、この配列から任意の要素を選択して印刷します。

関連情報