`/ dev / urandom`适合模拟目的吗?

时间:2015-08-21 11:53:50

标签: c linux unix random

似乎在类似unix的系统中使用普通C,来自fread的{​​{1}}是提取高质量随机字节的最简单方法。我需要运行一个每秒需要大约10k 32位随机数的模拟,它可能会运行几天。 /dev/urandom可以用于此目的吗?当熵池耗尽时,随机字节的质量如何?

edit_1

虽然我现在正在笔记本电脑中为/dev/urandom运行3次并行死硬测试,但我得到了以下有趣的内容。测试尚未完成。

/dev/urandom

4 个答案:

答案 0 :(得分:2)

/dev/urandom的底层实现中是一个CSPRNG,其输出池的最大周期为less than 2^(26∗32) − 1,然后将其输入SHA-1以生成/dev/urandom的输出。因此,urandom显然可以产生您想要的随机数量,但它无法为您提供可重现的结果 - 您必须缓存自己获得的序列。

您不必担心估计熵池耗尽时会发生什么,/dev/urandom会输出您要求的任何内容。 "理论攻击" urandom(4)手册页说的是nonexistent。 ("问题"是对什么"熵估计"是一个巨大的误解)

许多其他具有大周期的PRNG存在可重现的播种:C++中的Mersenne Twister,xorshift PRNG等。您应该能够使任何PRNG适应适合您目的的分布

答案 1 :(得分:1)

不,/ dev / random和/ dev / urandom是为加密应用程序设计的,您需要非常高的熵来换取速度。与良好的非CS PRNG相比,它们的运行速度非常慢,因此无法为模拟或蒙特卡罗积分提供足够的样本。

对于这些,使用快速但优质的PRNG,如XOR-shift +或Mersenne Twister。如果您不需要重复性,可以使用/ dev / urandom中的数据为PRNG播种。

答案 2 :(得分:0)

不,你不应该集中使用/dev/urandom,至少根据文档[虽然如果你阅读评论主题,你会发现文档误导的论点]:

  

内核随机数生成器旨在生成少量高质量种子材料,以便为加密伪随机数生成器(CPRNG)播种。它专为安全而非速度而设计,不适合生成大量随机数据。用户在从/ dev / urandom(和/ dev / random)读取的种子材料数量上应该非常经济;不必要地从该设备读取大量数据将对该设备的其他用户产生负面影响。 (来源:linux man 4 random

/dev/urandom的早期(2.6之前)linux实现在/dev/random/dev/urandom之间共享了一个熵池,但是现在使用的池有点独立,并且从{{1}读取}不会影响/dev/urandom的可用性。其他操作系统使用不同的策略。例如,在FreeBSD中,只有一个随机设备,它只在系统启动时阻塞。

一般来说,我的建议是熵被认为是一种资源,并且在没有明确需要的情况下不会大量消耗,如果没有其他原因,除了避免过于频繁和不必要的系统调用,这是相对昂贵的

在任何情况下,对于不需要加密随机性的蒙特卡罗模拟,你应该没有良好的PRNG;对于独立审判,您应该通过单次阅读/dev/random来播种PRNG。 (从/dev/urandom播种从来都不是一个好主意。)

答案 3 :(得分:0)

关于熵池耗尽时[/dev/urandom]随机字节的质量" O' Neill(2014)指出用于加密目的的发电机设计者"与通用随机数生成器相比,对统计属性(例如均匀性)没有相同的关注"。

这可以解释为什么/dev/urandom的输出未能通过统计检验,即使共识似乎即使在耗尽后/dev/urandom的输出也是好的。

如果你想将/dev/urandom和标准生成器的属性结合起来用于模拟目的,例如Mersenne Twister,我的建议是提取两个数据流。这些方法是完全不同的,它们不应该相互抵消。

参考:http://www.pcg-random.org/paper.html