XKCDに似たパスワードのリストからランダムな4つの単語を生成します。

XKCDに似たパスワードのリストからランダムな4つの単語を生成します。

まず、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

おすすめ記事