一些 GNU coreutils 实用程序喜欢sort
并shuf
使用文件作为有效地服务于种子的东西。文件大小重要吗?
推荐的方式https://www.gnu.org/software/coreutils/manual/html_node/Random-sources.html使用基于 openssl 的方法,需要相当长的时间。
如果我只使用如下 6 个字母的单词怎么办?这是否会影响所述实用程序创建伪随机性的能力?
shuf -i1-10 --random-source=<(echo durian)
如果您提供一个固定字符串作为随机源,那么它每次都会以相同的方式“随机化” 。为了证明这一点,让我们测试一下。
在我的系统上,每次运行上述命令时输出都是相同的。(我怀疑它可能会因实现而有所不同,但每次都应该是相同的。)根据这个 XKCD,您正在对随机性进行硬编码:
这不是真正随机的。它只是每次都产生相同的输出。固定字符串源的大小无关紧要。它仍然是固定的。
您提供的链接中有与随机源的随机质量相关的相关信息:
后两个选项比第一个选项“更随机”。这意味着源越随机,改组越随机。因此,固定字符串不是特别健壮。
具体来说,
shuf
固定字符串的长度是相关的。例如,以下失败。但是,如果将输出限制为
-n16
,它可以工作,但会-n17
失败。我测试了几个不同的单词和排列,当我减少源中的字符数时,最大值-n
会下降。我不确定直接关系,但大概额外的排序项目(在
-n
)需要更多的源字符作为种子。然而,shuf
至少,一旦你通过了这个最小阈值,每个额外的字符对随机性本身没有任何影响。在上面的示例中,如果您更改第 50 个字符,则输出仍然相同。是的,大小很重要
shuf
:大小必须与https://github.com/coreutils/coreutils/blob/master/gl/lib/randint.crandint_genmax()
中所需的一样大,以派生使用的随机数算法需要(每个数字都可以从特定范围内挑选)。这个大小取决于两者如果您更改随机源文件中的一个字节,它可以更改总共需要多少字节。例如,如果需要一个 0-254 范围内的数字,如果它恰好在这个范围内,则读取一个字节就足够了,但如果该字节是 '\xff'(255 作为一个无符号 8 位整数),则至少一个还需要更多字节。
这可用于构建一个即使提供了大量字节也会失败的示例:
只需三个字节 'ab'+newline 就足够了:
为了提供带有种子的伪随机源,我没有找到仅命令行的解决方案,但至少这里是仅使用 bash 的草案解决方案(请参阅下面的已知问题):
(1) 辅助脚本
seed-and-counter.sh
:(2) 辅助脚本
bin-hash-lines.sh
:(3) 将它们组合起来产生一个可重现的随机字节序列:
(4) 将此作为随机源:
已知问题:帮助脚本和
xargs
命令似乎一直在运行。