【问题标题】:True random dice roll真正的随机掷骰子
【发布时间】:2015-05-10 03:45:37
【问题描述】:

我有一段代码可以生成一个可用于 diceware 的滚动列表,但看起来并不理想。

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 的数字行。

最终,我希望程序自动将滚动的对替换为相应的骰子卷。使用上述卷,输出将变为:

ajar
rookie
benny
uh
47th
acrid
aback
coca
8:30
96
a

【问题讨论】:

  • 考虑向我们展示您想要的输出示例以及您当前获得的结果。照原样,我只能告诉你想用随机数做一些事情。
  • 我已经更新了这个问题,提供了一些我目前得到的和我希望得到的例子。
  • 为什么要生成中间文件?生成随机数列表很容易。
  • @Schwern 主要是为了好玩。我试图使用类似于 Random.org 的可以离线生成的东西。

标签: bash dice


【解决方案1】:

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;

【讨论】:

    猜你喜欢
    • 2014-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-30
    • 1970-01-01
    • 2014-02-01
    • 1970-01-01
    相关资源
    最近更新 更多