如何实现随机生成器?
我说的不是语言mathRandom()方法的调用,而是导致生成完全随机数字的例程的实现。
发布于 2012-12-17 23:06:49
真正随机数的关键是随机数据源。有时,这是一些信息,如键盘事件或网络事件中的延迟。如果需要高质量的随机数据,则可以是放射性衰变。SGI实现了拉瓦兰,它从熔岩灯的数字化图像中提取随机数发生器的种子。这足以被认为是一个随机数生成器。
在真正的随机数据之外,我们可以处理一个确定性但混沌的系统。例如,梅森龙卷风。在这种情况下,一个人用一个数字给生成器种子,然后向前运行,得到伪随机数。如果有人能确定种子(以及序列中的下一个数字),这些就足够了。
考虑阅读专利5,732,138和http://www.lavarnd.org/,了解有关如何生成数字的实现细节。
发布于 2012-12-18 00:12:45
你说的是什么样的随机?
数学意义上定义随机的两个主要性质是:第一是不可预测性的,第二是均匀分布的。
如果您是在谈论第一个问题,那么通常不可能完全在软件中生成它(并正确地进行)。有一些方法,例如从人机界面设备中收集熵,例如在Linux中的/dev/random,但是我们生成了一个相当低的熵级别才有用。其他人已经指出了一些硬件实现。它们都深深植根于物理学理论中(就像我们相信,光子撞击探测器的精确时刻确实是随机的)。这方面有一些软件算法,如布卢姆-布卢姆-舒布。通常,如果需要不可预测性,不要编写PRNG,而是使用已建立的PRNG。尤其是密码。
随机函数的另一个重要性质实际上是很容易满足的。这方面有很多例子,比如RC4背后的RNG、线性反馈移位寄存器 (以前也曾用于加密,但被发现不够安全)等等。甚至标准C库rand()也可能为此目的正常工作。
最重要的是:确保您知道这两个属性中的哪一个是您需要的基础。不可预测的PRNG也是均匀分布的,但事实并非如此。另外,如果你暴露了某种类型的“引擎”(比如游戏引擎)中的随机性,确保人们不能玩这个系统,因为你可能会惊讶于这实际上是多么容易。例如,CSS ( DVD加密算法)使用2个LSFR进行加密,并且很容易被破坏。
发布于 2012-12-17 22:55:44
首先,您不能在软件中生成真正的随机数。有很多不同的算法让你产生伪随机数。根据您为什么需要伪随机数(即,如果您在密码学中使用伪随机数的需求有很大的不同),您通常会使用类似于GNU科学图书馆中的随机数生成器(当然,您可以用您喜欢的任何语言实现它们)。
https://softwareengineering.stackexchange.com/questions/179798
复制相似问题