/ dev / urandom的分布是什么?代码验证?

时间:2017-01-30 21:45:37

标签: linux bash random

无处不在我看来它在Linux上/dev/urandom是"随机",但没有任何来源我可以找到引用什么样的随机"随机"是。我希望它在字节上的0x01到0xff接近均匀。如果我想测试一下,那么估算分布的最佳方法是什么? bash首选的解决方案。

2 个答案:

答案 0 :(得分:2)

这是一个Python程序,它显示它非常均匀(至少在macOS上):

import os
cnt, start=[10000000]*2
buckets={}
while cnt:
    c=os.urandom(1)
    buckets.setdefault(c, 0)
    buckets[c]+=1
    cnt-=1

ideal=1/256.0
if len(buckets) != 256: print('{} missing keys'.format(256-len(buckets)))
for k, v in sorted(buckets.items()):
    actual=float(buckets[k])/start
    print('{:8} {:10.4%} {:10.4%}'.format(repr(k), actual, actual-ideal ))

打印:

b'\x00'     0.3892%   -0.0014%
b'\x01'     0.3950%    0.0044%
b'\x02'     0.3856%   -0.0050%
b'\x03'     0.3901%   -0.0006%
b'\x04'     0.3894%   -0.0013%
b'\x05'     0.3881%   -0.0025%
b'\x06'     0.3912%    0.0006%
b'\x07'     0.3912%    0.0005%
b'\x08'     0.3951%    0.0044%
b'\t'       0.3928%    0.0022%
b'\n'       0.3877%   -0.0029%
...
b'\xf7'     0.3914%    0.0008%
b'\xf8'     0.3906%   -0.0001%
b'\xf9'     0.3917%    0.0011%
b'\xfa'     0.3910%    0.0004%
b'\xfb'     0.3884%   -0.0022%
b'\xfc'     0.3915%    0.0009%
b'\xfd'     0.3904%   -0.0002%
b'\xfe'     0.3894%   -0.0013%
b'\xff'     0.3914%    0.0008%

答案 1 :(得分:1)

回答我自己的问题:

cat /dev/urandom | hexdump -n 100000000 -v -e '/1 "0x%02X\n"' | sort -n | uniq -c | awk '{print $1/100000000"\t"$2;}'

效果很好。

RFC 1750:https://tools.ietf.org/html/rfc1750。输出不统一,但其目标是接近。