为什么在每个系统上对 /dev/urandom 中的重复数字进行计数都相同?

为什么在每个系统上对 /dev/urandom 中的重复数字进行计数都相同?

该命令生成数字/dev/urandom并打印有多少重复数字,在每个系统上返回相同的结果。为什么?

dd if=/dev/urandom count=1 bs=5M 2> /dev/null | od - | cut -d " " -f 2- | sed s/" "/"\n"/g | sort -n | uniq -d | wc -l

这是命令,在我运行此命令的每个系统上,它都会返回 256^2(16 位上限)、UNIX 系统上的端口数量,或者仅返回 65536,包括在不同的体系结构上。

奇怪的是,每个数字都是 6 位数字,即使是 5M,数据转储也远远大于可能的数字量 ~ 数字不重复的可能性很小。

可能的数字数量:100000(因为 00000-99999)

数据转储中的行 (5M):2621441

对于任何超过约 1M 的数据集,它都会打印相同的结果。

如果我在输出中 grep 查找一个随机数,比如说 045765,它会弹出 35-47 次,每次都有不同的数量。

我写了一个小的Python脚本来计算数字,只有一个不是唯一的,但那是哑巴中的最后一个数字,可能是因为EOF。打印数据转储时,它总是比其余数字长并且不适合,因此我们可以忽略它。它证明没有数字是唯一的,用 2621441 行证明有超过 65536 个唯一数字。

我无法理解这是怎么发生的......该命令中的某些组件必须有一个错误。

有谁能解释一下这是如何发生的?

答案1

一个词:八进制。

打印的od是从000000177777,其中数字是0..7。这些字符串只是以不同方式编码的两个字节值。不同的编码并没有改变有 65536 种可能性的事实。从足够大的随机数据集中,您可以得到所有这些。

即使“按数字”数,一切都合适;你只需要正确地使用八进制即可。你的尝试:

可能的数字数量:100000(因为 00000-99999)

假定为十进制。正确的方法是这样的:

  • 第一个字符是01, (2 种可能性)。
  • 然后有 5 个字符0..7,(每个字符有 8 种可能性)。

2×8 5 = 2 16

相关内容