我有一段代码可以生成一个diceware-ready卷列表但看起来并不理想。
strings -n 1 rd | egrep -o "[1-6]" | tr -d "\n" | fold -w5 > dice
由于它只查找[1-6],因此生成列表需要的数据量要多得多。输出如下:
15531
52142
13645
62143
66211
11255
11124
21166
66555
66632
11111
为了缓解这种情况,我发现了以下内容:
echo $((0x$(head -c5 rd | xxd -ps)%6+1))
然而,我无法将其修改为我想要的工作方式。正如预期的那样,这只输出1个随机骰子。作为一个例子,它将输出:
3
它没有进一步进入文件。我喜欢它来处理整个文件(比如第一段代码)并输出准备好diceware的数字行。
最终,我希望让程序自动用相应的diceware卷替换卷对。使用上面的滚动输出将改为:
ajar
rookie
benny
uh
47th
acrid
aback
coca
8:30
96
a
答案 0 :(得分:3)
Bash提供$RANDOM
以生成0到32767之间的随机数。
RANDOM每次引用此参数时,都会生成0到32767之间的随机整数。可以通过向RANDOM赋值来初始化随机数序列。如果未设置RANDOM,即使它随后被重置,它也会失去其特殊属性。
它不是一个大量的随机性,但应该足够你的密码生成器。 The answers over here explain how to get a specific random range
或者,Perl可以做得很好。这是一个班轮......
$ perl -nwle 'push @words, $_; END { print join ".", map { $words[rand @words] } 1..3 }' /usr/share/dict/words
或者作为一个小程序更可读。
#!/usr/bin/env perl
use strict;
use warnings;
use autodie; # IO functions will error if they fail
# Read the dictionary
open my $fh, "/usr/share/dict/words";
my @words = <$fh>;
chomp @words;
# Pick three random words joined with a .
print join ".", map { $words[rand @words] } 1..3;