比较随机和随机

时间:2013-02-06 21:02:26

标签: python linux random

我被问到:

  

使用您的raspberry pi,编写一个确定随机性的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更快,并且拥有比随机更大的池。但是,如果我尝试阅读超过15的任何内容,那么阅读的时间似乎会呈指数级增长。

所以我现在迷失了如何比较'随机性'。如果我同时读取urandom和random到各个文件,我怎么能比较它们呢?

2 个答案:

答案 0 :(得分:2)

您的体验可能正是他们所寻求的。从urandom(4)的手册页:

  

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

     

来自/ dev / urandom设备的读取不会阻止等待更多的熵。

请注意有关阻止的内容。 urandom不会,随机会。特别是在嵌入式上下文中,可能很难获得额外的熵,这会导致您看到的阻塞。

答案 1 :(得分: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饱和点。