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


8

コマンドライン自体から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は私がランダムに印刷したい単語の長さです。

どうすれば本当にランダムな単語を印刷できますか?


3
$RANDOMかなり可能性が高いの数よりも大きいことがあるのnのほとんどの値について-letter言葉のn(95.7時間の%nは私のために= 3)。
Michael Homer

ランダムな単語を完全に印刷しようとしていますか。たとえ単語でなくても、辞書からランダムに印刷しますか?
iZodiac

タスクがセキュリティに関連している場合(パスワードの作成など)、そのタスク用に作成されたツールを使用する必要があります。それ以外の場合は、shufまたはsort -R回答で提案されているとおりに使用できます。も使用できますが$RANDOM、より高度な方法で使用できます。これらのツールはすべて、予測可能な結果を​​生成しますが(実際にはランダムではありません)、高速で多くの目的に十分対応できます。
sudodus

1
多分彼らはこの方法を使用します(必須のXKCD参照)
molnarm

回答:


20

そうではありません。しかし、$ RANDOMは大きな数(0から32767の間)を返します。これは、特に長さが制限されている単語の場合、同じ結果を示します。これは、headおそらくgrepのすべての結果を返すためです(3では819のみ一致します/usr/share/dict/words)。

より良い解決策は結果をシャッフルすることかもしれません:

egrep "^.{$num}$" /usr/share/dict/words | sort -R | tail -n 1

where -R--random-sort(GNU sort拡張)を意味します。


16
なんでtail?それはOPのスクリプトでは意味をなされていますが、あなたにも使用することができシャッフルしていることからhead、その後、sort残りの行をシャッフルわざわざ壊れたパイプを検出しないことができるはずです。
Peter Taylor

@PeterTaylorはおそらく良いヒントです。尾を使用することは私の習慣です...結局のところ、私はおそらくさらにshuf -n11つ少ないパイプを好むと思います...
JakubLuckýJun

19

任意のnum文字の単語を出力する簡単な方法は、次のものを使用しますshuf

egrep "^.{$num}$" /usr/share/dict | shuf -n1

shufコマンドは、入力のランダム順列を出力し、-n1フラグが、この結果からのみ出力するように最初の項目をそれに伝えます。


3
またはgrep -Ex ".{$num}"。またはawk 'length == n' n="$num"'
ステファンChazelas

5

他の人が指摘したように、コードの主な問題は、$RANDOM多くの場合、特定の長さの単語数よりもはるかに大きな値になることです。

使用awkのみ:

$ awk -v len="$num" 'length == len { word[i++]=$0 }
                     END { print word[int(i*rand())] }' /usr/share/dict/words
Bosniac

プログラムは、指定されたファイルから特定の長さのすべての行を読み取ります。これらは配列に格納されwordsます。

最後に、この配列からランダムな要素が選択されて印刷されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.