好吧,我猜这完全是主观的,但我正在考虑随机数生成器的熵源。大多数发电机都按当前时间播种,对吗?好吧,我很好奇其他资源可以用来生成完全有效的随机(松散定义)数字。
使用多个来源(例如时间+当前硬盘寻找时间[我们在这里真是太棒了])一起创建一个比单个来源更“随机”的数字?来源数量的逻辑限制是什么?真的够多少钱?选择时间只是因为方便吗?
如果不允许这种事情,请原谅我,但我对这些消息来源背后的理论感到好奇。
答案 0 :(得分:17)
关于Hardware random number generator's的维基百科文章列出了几个使用物理属性的随机数的有趣来源。
我的最爱:
维基百科文章的problems section也描述了很多这些来源/传感器的脆弱性。随着传感器老化/退化,传感器几乎总是产生递减的随机数。应通过统计测试不断检查这些物理来源,统计测试可以分析生成的数据,确保仪器不会无声地破坏。
答案 1 :(得分:8)
SGI曾使用各种“水珠相”的熔岩灯照片作为熵的来源,最终演变成一个名为LavaRnd的开源随机数发生器。
答案 2 :(得分:5)
我使用Random.ORG,他们提供来自大气噪声的免费随机数据,我用它来定期重新播种Mersene-Twister RNG。它几乎是随机的,没有硬件依赖。
答案 3 :(得分:4)
不要担心随机数生成器的“好”种子。序列的统计特性不依赖于如何播种发生器。但是还有其他的事情。担心。请参阅Pitfalls in Random Number Generation。
对于硬件随机数发生器,必须测量这些物理源,并且测量过程存在系统误差。您可能会发现“伪”随机数的质量高于“真实”随机数。
答案 4 :(得分:3)
Linux内核使用设备中断计时(鼠标,键盘,硬盘驱动器)来生成熵。维基百科上有一个很好的article熵。
答案 5 :(得分:3)
根据附近种子的相关性检查现代RNG,并在播种后运行数百次迭代。所以,不幸的是,无聊而又真实的答案是它真的无关紧要。
一般来说,必须检查使用随机物理过程它们是否符合均匀分布,否则会被去除。
In my opinion, it's often better to use a very well understood pseudo-random number generator.
答案 6 :(得分:2)
我使用了一个加密程序,它使用用户鼠标移动来生成随机数。唯一的问题是程序必须暂停并要求用户随机移动鼠标几秒钟才能正常工作,这可能并不总是实用。
答案 7 :(得分:2)
几年前我发现了HotBits - 数字来自放射性衰变,真正的随机数字。
每天可以下载的数量有限制,但我总是很乐意将它们用作RNG真正随机的种子。
答案 8 :(得分:2)
某些TPM(可信平台模块)“芯片”具有硬件RNG。不幸的是,戴尔笔记本电脑中的(Broadcom)TPM缺乏此功能,但今天出售的许多电脑配备了硬件RNG,使用真正无法预测的量子力学过程。英特尔已经实施了热噪声。
此外,不要仅使用当前时间来为加密目的播种RNG,或者任何不可预测性很重要的应用。从时间开始使用一些低阶位与其他几个源一起使用可能没问题。
similar question可能对您有用。
答案 9 :(得分:1)
对不起,我迟到了这个讨论(现在3岁半的时候是什么?),但我对PRN的产生和其他熵的来源重新燃起了兴趣。 Linux内核开发人员Rusty Russell最近讨论了他的blog关于其他熵的来源(/dev/urandom
除外)。
但是,我对他的选择并不是那么令人印象深刻; NIC的MAC地址永远不会改变(虽然它与其他所有地址都是唯一的),并且PID看起来似乎太小了。
我已经用Mersenne Twister(在我的Linux机器上)涉及以下算法播种。如果有人愿意和感兴趣,我会要求任何意见/反馈:
/proc
个文件数。对于以下每个/proc
文件,计算SHA256总和:
/proc/meminfo
/proc/self/maps
/proc/self/smaps
/proc/interrupts
/proc/diskstats
/proc/self/stat
将每个256位散列值放入(1)中创建的数组的自己区域。
现在我有256位 HOPEFULLY 随机(足够)熵数据来播种我的Mersenne Twister。我使用上面的代码填充MT数组的开头(624个32位整数),然后用MT作者的代码初始化该数组的其余部分。此外,我可以使用不同的哈希函数(例如SHA384,SHA512),但我需要一个不同大小的数组缓冲区(显然)。
最初的Mersenne Twister代码需要一个32位种子,但我觉得这非常不合适。在这个时代运行“仅仅”2 ^ 32-1个不同的MT来寻找破解密码并不超出实际可行性范围。
我很想阅读任何人对此的反馈。批评非常受欢迎。我将捍卫我对/proc
文件的使用,因为它们不断变化(特别是/proc/self/*
文件,TSC总是产生不同的值(纳秒[或更好]分辨率,IIRC)。我已经对此进行了Diehard tests(达到了几百个十亿位),它似乎正在以绚丽的色彩传递。但这可能更能证明梅森的稳健性作为PRNG的Twister而不是我如何播种它。
当然,这些并非完全不受黑客攻击,但我只是没有看到所有这些(和SHA *)被黑客攻击和在我的一生中。
答案 10 :(得分:0)
有些人使用键盘输入(按键之间的超时),我听说我认为在小说中可以使用无线电静态接收 - 当然这需要其他硬件和软件......
答案 11 :(得分:0)
宇宙微波背景光谱之上的噪声。当然,您必须先删除一些各向异性,前景物体,相关探测器噪声,星系和局部群速度,极化等。许多pitfalls remain。
答案 12 :(得分:0)
不要担心随机数生成器的“好”种子。序列的统计特性不依赖于发生器的播种方式。
我不同意John D. Cook's advice。如果您将Mersenne Twister的种子设置为除了一个之外的所有位,它将最初生成除随机之外的任何数字。生成器需要很长时间才能将此状态转换为可通过统计测试的任何状态。简单地将发生器的前32位设置为种子将产生类似的效果。此外,如果整个状态设置为零,则生成器将产生无穷无尽的零。
正确编写的RNG代码将具有正确编写的种子算法,该算法接受64位值并为发生器播种,因此它将为每个可能的输入产生适当的随机数。因此,如果您使用的是可靠的库,那么任何种子都可以。但如果您将自己的实现混合在一起,那么您需要小心。
答案 13 :(得分:0)
种子来源并不重要。更重要的是伪数生成器算法。不过,我前段时间曾听说过为一些银行业务生成种子。他们将许多因素结合在一起:
即使这些参数中的某些参数在时间上没有太大变化,也可以将它们放入一些良好的散列函数中。
如何生成好的随机数?
也许我们可以考虑到无数的宇宙?如果这是真的,那么在创建新的并行宇宙的过程中,我们可以做到这样的事情:
int Random() {
return Universe.object_id % MAX_INT;
}
在每一刻我们都应该在平行宇宙的另一个分支上,所以我们应该有不同的id。唯一的问题是如何获取Universe对象:)
答案 14 :(得分:0)
如何在一个线程中旋转一个线程,该线程将在一个紧密循环中操纵一些变量一段固定的时间才能被杀死。你最终得到的将取决于处理器速度,系统负载等...非常好,但比srand(时间(NULL))更好......