【问题标题】:Comparing random and urandom比较随机和随机
【发布时间】:2013-02-06 21:02:26
【问题描述】:

有人问我:

使用您的树莓派,编写一个确定随机性的 Python 脚本 /dev/random 和 /dev/urandom。读取字节和直方图结果。 在 matplotlib 中绘图。你的答案包括 python 脚本。

我目前对“确定随机性”这一短语感到迷茫。

我可以从 urandom 和随机读取:

#rb - reading as binary
devrndm = open("/dev/random", 'rb')
#read to a file instead of mem?
rndmdata = devrndm.read(25) #read 25bytes

with open("/dev/random", 'rb') as f:
    print repr(f.read(10))

我认为这个练习的目的是找出 urandom 比 random 更快并且拥有更大的池。但是,如果我尝试阅读超过 15 的任何内容,阅读时间似乎会成倍增加。

所以我现在不知道如何比较“随机性”。如果我将 urandom 和 random 都读取到各自的文件中,我该如何比较它们?

【问题讨论】:

  • 以下内容和其中的链接可能是一个好的开始:en.wikipedia.org/wiki/Randomness_tests
  • 我认为它们的意思是“读取字节并绘制结果直方图。在 matplotlib 中绘图。”。
  • 虽然均匀分布并不代表随机性。
  • 除非在启动的早期,否则您不会看到差异。见2uo.de/myths-about-urandom。您还可以通过使用带有 jitterentropy 源的 rngd 尽早添加更多熵。它已经在 Fedora 和 RHEL/CentOS 中了。不确定其他发行版。

标签: python linux random


【解决方案1】:

您的体验可能正是他们想要的。来自 urandom(4) 的手册页:

读取时,/dev/random 设备只会返回 估计的噪声位数内的随机字节 在熵池中。 /dev/random 应该适合需要非常高质量随机性的用途,例如 一次性垫或密钥生成。当熵池为空时,从 /dev/random 读取将阻塞,直到添加 收集到的环境噪音。

从 /dev/urandom 设备读取不会阻塞等待更多熵。

注意关于阻塞的一点。 urandom 不会,随机会。特别是在嵌入式环境中,可能很难获得额外的熵,这会导致您看到的阻塞。

【讨论】:

  • 除了可以添加手动熵和环境噪声之外,还可以在此处找到大量信息:calomel.org/entropy_random_number_generators.html
  • 问题是关于输出的质量,而不是关于阻塞或时间。
  • 它确实询问阅读时间增加,这是我的回应。
【解决方案2】:

可以这么简单:

In [664]: f = open("/dev/random", "rb")
In [665]: len(set(f.read(256)))
Out[665]: 169


In [666]: ff = open("/dev/urandom", "rb")
In [667]: len(set(ff.read(256)))
Out[667]: 167


In [669]: len(set(f.read(512)))
Out[669]: 218

In [670]: len(set(ff.read(512)))
Out[670]: 224

即。要求 256 个字节不会返回 256 个唯一值。因此,您可以根据唯一计数绘制不断增加的样本量,直到达到 256 个饱和点。

【讨论】:

    猜你喜欢
    • 2015-05-28
    • 1970-01-01
    • 1970-01-01
    • 2020-11-22
    • 2018-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多