我被问到:
使用您的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到各个文件,我怎么能比较它们呢?
答案 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饱和点。