给定相同的种子,随机数生成器会产生不同的输出吗?


10

标题总结了一下。我很想知道是否存在一种算法,该算法能够在给定相同输入的情况下产生可变输出,而无需依赖其他来源(例如DateTime.Now)或从光传感器生成的数字等随机性。此外,该算法无法运行按顺序,只有两个不同的,不相关的运行会产生不同的输出。


具体来说,您正在谈论的是伪随机数生成器。
Marcel

大多数语言都允许实例化一个随机数生成器不必指定种​​子,这样种子也是“随机的”。使用种子是有原因的。
尼尔

1
@Neil:在那种情况下,仍然有一个种子,它只是隐式的,通常是系统时间。
Michael Borgwardt

@MichaelBorgwardt,我只是说种子也是随机的。当然,没有什么是真正随机的,但是通常系统时间会提供一个不错的种子,只要您不经常实例化一个随机数生成器而不传递一个种子,在这种情况下,您可能会两次获得同一种子“随机”种子。
尼尔

对于不精确的硬件,有一个有趣的研究领域,该领域在统计上定义明确。潜在的好处是降低了功耗。仅2.0 + 2.0在这样的系统上进行计算不会得出相同的结果。它不需要另一个随机性来源。
MSalters 2013年

Answers:


15

我很想知道是否存在一种算法,能够在给定相同输入的情况下产生可变输出,而无需依赖其他来源的随机性,例如DateTime.Now或从光传感器生成的数字等。

不,从根本上讲这是不可能的,因为算法的确切定义是定义明确,确定性强,即给定相同的输入将始终产生相同的输出。有随机算法,但是它们需要随机性作为输入。

此外,决定是计算机硬件的最重要的设计目标。如果给定相同的输入,则不会产生相同的输出的CPU在大多数情况下将毫无用处。


14

不,伪随机数生成算法将始终在给定相同种子的情况下产生相同的输出(因此为随机数)。

我发现使用术语“算法”而不是“程序”很有趣。这排除了一类肯定的答案(RAM中的软错误,多线程RNG中的不同线程交织等)。如果您认为算法的每次运行在每次迭代中均接受相同的输入(没有随机性)是经过明确指定的,那么它将在每次运行中生成相同的输出。

话虽如此,即使对CPU温度这样的基本事物进行适当的标准化,也无法预测到足以充当熵的来源。因此,如果您知道运行什么时间,就不要认为这意味着可以预测“加密安全”的随机数生成器;他们中的许多人利用系统生成的熵Feed。


算法是正确的词:)我正在特别尝试消除熵的外源,内存错误,线程顺序,不可预测的输入(例如光源)等。我认为我的问题源于我对随机算法的理解不足,也许我本可以使这个问题更笼统。我真的很想知道是否有可能创建任何在给定相同输入(包括所有熵源)的情况下返回不同结果的函数。似乎答案是否定的
ConditionRacer

7

您是否知道人们非常努力地确保给定相同的种子,每次产生相同的随机数序列?对于诸如蒙特卡洛模拟之类的事物而言,这是理想的属性,因为这意味着结果是完全可重现的。如果您不指定种子,则将使用诸如时间之类的方法,但是确实需要精确的可重复性。

唯一真正不希望这样做的RNG是用于加密的RNG,并且通常通过使用操作系统自己的随机数源(在正常情况下不可重绕并且可能使用特殊硬件)来提供它们的种子,以实现此目的。


是的,我明白您的意思。我没有尝试实施任何新方法,这只是深夜的好奇心。
ConditionRacer

1

我想如果您在不同的硬件平台上实现该算法,并且使用诸如从整数中获取中间N位的技术,则可以想象得到,如果整数编码不同(大/小/中端),您将获得不同的答案。如果您要处理浮点数,则可能会遇到在具有FPU的计算机上运行的问题,而与没有FPU的计算机上运行的问题有关。在台式机上可能不是问题,但在手机上可能是问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.