まず、txtファイルから任意の行を出力する方法を知っています。
perl -MList::Util -e 'print List::Util::shuffle <>' words.txt
ただし、txtファイルからランダムな4つの単語を出力するには、一般的なソリューション(perlは通常すべてのUnixファミリーオペレーティングシステムにインストールされています)が必要です。どうすればいいですか?
$ cat words.txt
...
alpha
beta
gamma
delta
epsilon
...
$
「…」は他の多くの言葉を意味する。
出力例(それらの間に改行はありませんが、最後にUnixの改行が必要であり、スペースで区切る必要があります):
$ perl SOMEMAGIC words.txt
gamma alpha delta beta
$
Perlだけを使用するのが最短のソリューションです(oneliner)。
これは人間にとって記憶に残るパスワードジェネレーターとして機能します。https://xkcd.com/936/
afaik perlは「ランダムジェネレータ」と呼ばれるほど優れているからです。
32768の一意の行を持つ一般的な英語の単語テーブルの例:https://pastebin.ubuntu.com/23726760/
答え1
Perlは実際に乱数を安全に生成するためにサードパーティのライブラリが必要なので、あまり良いツールではありません。基本乱数ジェネレータ(rand
または、同じソースの他のコンテンツ(List::Util::shuffle
セキュリティ関連の目的に適していないコンテンツなど)を使用します。 Perlを使いたいならインストールしてください数学::ランダム::安全(およびその依存関係)(perl -MCPAN -eshell
および実行install Math::Random::Secure
)。
perl -MMath::Random::Secure=rand -l -e '@words = <>; print map $words[rand(@words)], 1..4' words.txt
代わりにPythonを使用することをお勧めします。今日、これはPerlほど一般的であり、標準ライブラリはより包括的です。はい、コードは長いですが、短縮コード自体が品質を表すわけではありません。
python -c 'import random, sys; rng = random.SystemRandom(); words = sys.stdin.readlines(); print " ".join([words[rng.randrange(0, len(words))].strip() for i in xrange(4)])' <words.txt
より読みやすい複数行形式で:
import random, sys
rng = random.SystemRandom()
words = sys.stdin.readlines()
print " ".join([words[rng.randrange(0, len(words))].strip() for i in xrange(4)])
または、アンティーク以外のGNU coreutils(組み込み以外のLinuxおよびCygwinの場合)がある場合は、次のものを使用できます。shuf
便利です。 optionsを介して安全なランダムジェネレータを渡す必要があります--random-source
。
shuf --random-source=/dev/urandom -r -n 4 words.txt
答え2
あなたはそうではありません。反対するPerl以外のソリューションでは、ほとんどのシステムで実行されるものが必要です。この場合、以下はGNUコアユーティリティのみを使用します。
sort -R --random-source=/dev/urandom words.txt | head -n4 | paste -s -d' '
shuf
Gillesの提案に従って、以下を使用するように修正されました。
shuf -n 4 -r words.txt | paste -s -d' '
答え3
(@Gillesが言及したセキュリティ問題は無視してください)
perl -0nE '@a=split; say join(" ", map{ $a[rand @a] } 1..4)'
またはCamelCaseを好むなら...
perl -0nE '@a=split; say map{ ucfirst $a[rand @a] } 1..4'