Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 这个神奇数字的目的是什么?_Actionscript 3_Random_Magic Numbers - Fatal编程技术网

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;
}