我运行以下命令来生成 10 亿个随机数:
time shuf -i 1-1000000000 > "SHUF TEST 1"
令我惊讶的是,它能够在不到 10 分钟的时间内完成此操作。然后我运行输出文件以uniq -d
确定生成的数字中有多少是重复的,当结果为 0 时,我再次感到惊讶。我还运行输出文件uniq -u
并sort -u
确认这些结果。
这个命令如何shuf
能够在如此短的时间内生成十亿个随机数?我能依赖它的随机性吗?请注意,我不需要一个加密安全的随机数生成器来满足我的需求,只要它足够好,能够始终返回一个唯一的数字就行。
答案1
该shuf
实用程序通过输出输入行的随机排列来打乱其输入。根据其手册页,“每个输出排列的可能性都相同”。类比一下,就是洗牌。
如果输入行包含重复项,则 的输出shuf
也将包含重复项。为什么?因为shuf
对其输入执行随机排列。如果输入行不包含重复项,则 的输出shuf
也将不包含重复项。
在您的示例中shuf -i 1-1000000000
,该-i
选项使shuf
表现得好像其输入来自包含 1 到 1000000000 的无符号十进制整数范围的文件,每行一个无符号整数。换句话说,shuf
表现得好像它有 1000000000 行输入,每行包含一个唯一的无符号整数。因此在输出中找不到重复项。