Actionscript 3 这个神奇数字的目的是什么?
以下代码片段取自: 代码的第一行很容易理解,它是一个标准,乘法器是Actionscript 3 这个神奇数字的目的是什么?,actionscript-3,random,magic-numbers,Actionscript 3,Random,Magic Numbers,以下代码片段取自: 代码的第一行很容易理解,它是一个标准,乘法器是16807。第二行的第一部分将结果整数转换为大致介于0和1之间的浮点 但是,第二行的最后一部分,+0.000000000233的目的是什么?在这样的RNG中它是必要的,还是有不同的用途?我认为,出于某种原因,\u currentSeed可能是负值,因为\u currentSeed是有符号整数。将0.000000000233(0.5/0x7fffffff)添加到该值可以避免这种情况。如果查看公式的其余部分,您将看到\u curren
16807
。第二行的第一部分将结果整数转换为大致介于0
和1
之间的浮点
但是,第二行的最后一部分,
+0.000000000233
的目的是什么?在这样的RNG中它是必要的,还是有不同的用途?我认为,出于某种原因,\u currentSeed
可能是负值,因为\u currentSeed
是有符号整数。将0.000000000233
(0.5/0x7fffffff
)添加到该值可以避免这种情况。如果查看公式的其余部分,您将看到\u currentSeed
值0
将始终导致相同的0
值。添加(0.5/0x7fffffff)
,可防止其卡在0
上,但足够小,也可防止其返回值=1
公平地说,我在6年多前写过这段代码,所以我可能记错了,但我相当确定这就是原因。该算法的大部分是素数模乘法线性同余生成器。所有这些前缀形容词都意味着它在不使用广义s所具有的加法项的情况下实现了最大循环长度,因此pmmlcg在20世纪50年代很流行,因为每次调用只需少做一次操作。您永远不应该将
\u currentSeed
初始化为零,并且如果正确地实现和设定种子,该算法设计为永远不会产生零或负数,因为它基于精确的整数算法。(正确的实现意味着确保结果不受整数溢出的影响。早在1959年,Linus Schrage就用FORTRAN编写了一个可移植的算法,并进行了一个简单的测试,其中包括1000次迭代后种子值应该是什么。)
幻数略大于
(1/2)/0x7fffffff
,因此它不应将返回值推高超过1。由于未将其添加到\u currentSeed
,因此它在避免将\u currentSeed
设置为零时可能发生的定点行为方面没有任何作用。老实说,我看不出它完成了多少事情。我把它标记为AS3,但我确信这个问题也适用于许多其他编程语言;这很神奇。好吧,这在理论上是有意义的,但是,值0.000000000233
实际上从未添加到\u currentSeed
的值中,它只添加到函数返回的浮点值中。事实上,如果将\u currentSeed
设置为0
,它仍然会一直返回0
,即使您的“保护措施”已经到位。实际上,看看我链接到的其余代码,\u currentSeed
是一个无符号整数。即使它是有符号的,并且永远是负数,添加这么小的值也不足以使它成为正数。
public function random():Number {
_currentSeed = (_currentSeed * 16807) % 2147483647);
return (_currentSeed/0x7FFFFFFF) + 0.000000000233;
}