Actionscript 3 如何使Math.random每次在AS3中调用时都调用不同的值?

Actionscript 3 如何使Math.random每次在AS3中调用时都调用不同的值?,actionscript-3,math,random,Actionscript 3,Math,Random,假设我有一个函数,它第一次被调用时,我有一个随机值,但每隔一次被调用时,我得到的数字与它第一次吐出的数字相同。我可以做些什么来确保每次调用时都是随机的 if (Cosmo.hitTestObject(Asteroid5)) { Asteroid5.y = (Math.random() * 20 - 5); Asteroid5.x = (Math.random() * 20 - 15); Asteroid5.x = Asteroid5.

假设我有一个函数,它第一次被调用时,我有一个随机值,但每隔一次被调用时,我得到的数字与它第一次吐出的数字相同。我可以做些什么来确保每次调用时都是随机的

if (Cosmo.hitTestObject(Asteroid5))
    {



        Asteroid5.y = (Math.random() * 20 - 5);
        Asteroid5.x = (Math.random() * 20 - 15);
        Asteroid5.x = Asteroid5.x + (Math.random() * 20 - 15);
        Asteroid5.y = Asteroid5.y + (Math.random() * 20 - 5);
    }

[根据以下评论编辑] Math.random()的AS3参考页显示:


返回伪随机数n,其中0[根据下面的注释编辑] Math.random()的AS3参考页显示:


返回一个伪随机数n,其中0在前2条语句中,似乎使用Asterbo5.y和Asterbo5.x作为变量。所以一个想法是使用正确类型的变量(我假设它是数字):

var rndX:Number=(Math.random()*20-15); var rndY:Number=(Math.random()*20-5); var rndX2:Number=rndX+(Math.random()*20-15); var rndY2:Number=rndY+(Math.random()*20-5); 小行星5.x=rndX2; 小行星5.y=rndY2;或 var rndX:数字; 变量rndY:数字;
对于(var i:uint=0;i在前2个语句中,您似乎使用Asterbo5.y和Asterbo5.x作为变量。因此,一个想法是使用正确类型的变量(我假设它是数字):

var rndX:Number=(Math.random()*20-15); var rndY:Number=(Math.random()*20-5); var rndX2:Number=rndX+(Math.random()*20-15); var rndY2:Number=rndY+(Math.random()*20-5); 小行星5.x=rndX2; 小行星5.y=rndY2;或 var rndX:数字; 变量rndY:数字;

对于(vari:uint=0;这是事实的错误表示。表示
Math.random()
没有种子并返回0到1之间的伪随机数。理论上,不需要种子。我相信您误解了伪随机数生成器的工作原理。它们将使用使用先前生成的值的公式生成数字。因此,如果第一个值是“种子”用户可以显式地生成不同的序列(而不是每次调用Math.random()时以完全相同的顺序获得完全相同的值)。这极不可能:-)。类中会有一个内部种子;很可能是某个描述的时间戳。我不认为Adobe发布的psuedo随机数生成器总是返回相同的数字…这正是C/C++标准库PRNG的工作方式。但是,我运行了一些AS3代码进行检查,您是对的:)Adobe将种子烘焙到类中。我不知道OP是如何每隔一段时间得到相同的结果的。你得到的结果表明你的代码@user2072135有一个根本性的问题;伪造随机数发生器不是最好的方法。你几乎同时得到两个随机数。做这件事的时间不会有太大的变化。你会得到两个几乎相同的随机数。你需要找出它发生的原因。这是对事实的错误陈述。指示
Math.random()
没有种子,并返回一个介于0和1之间的psuedo随机数。理论上,应该没有必要播种。我相信你误解了伪随机数发生器的工作原理。它们将使用使用先前生成的值的公式生成一个数字。因此,如果第一个值由用户显式“种子化”,则可以生成不同的序列(而不是每次调用Math.random()时以完全相同的顺序获得完全相同的值)。这极不可能:-)。班上会有一个内部种子;最有可能是某种描述的时间戳。我不认为Adobe发布的psuedo随机数生成器总是返回相同的数字……这正是C/C++标准库PRNG的工作方式。但是,我运行了一些AS3代码进行检查,您是对的:)Adobe将种子烘焙到类中。我不知道OP是如何每隔一段时间得到相同的结果的。你得到的结果表明你的代码@user2072135有一个根本性的问题;伪造随机数发生器不是最好的方法。你几乎同时得到两个随机数。做这件事的时间不会有太大的变化。你会得到两个几乎相同的随机数。您需要找出它发生的原因。您是否绝对确定
Math.random()
多次返回相同的值?(例如,您是否添加了一些跟踪语句以进行检查。)因为这肯定不是
Math.random()
正常工作的方式。似乎是正确的。也许是你使用的两个小行星5的问题。举一个完整的例子怎么样?我怀疑还有别的东西在重置你的小行星位置。你是否将它们的初始位置设置为一帧上的变量,然后再返回到该帧?没有,但我的图层有点搞砸了,我在第一个答案的注释中发布了这个,但我会复制并粘贴到这里。“我知道我的Math.randoms在我的函数中,所以每次调用它们时,它们应该是不同的,对吗?可能是在我的层中,在我的主层中,我为每个对象设置了一个速度值,然后在不同的层中(关于我为什么这样做的长篇大论)我有一个if语句说,如果这个物体被击中,给它分配一个随机的x和y值。这可能是问题的原因吗?“在回答@caerolus定义你所说的工作示例的意思时,你需要更多的代码吗?另外,我还没有使用微量元素,但你是对的,可能还有其他东西重置小行星的运动,但是我不确定那会是什么,我还没有写任何东西来做这件事。你绝对确定
Math.random()
多次返回相同的值吗?(例如,您是否添加了一些跟踪语句以进行检查。)因为这肯定不是
Math.random()
正常工作的方式。似乎是正确的。也许是你使用的两个小行星5的问题。一个完整的工作示例如何?我怀疑其他内容被重置了
var rndX:Number = (Math.random() * 20 - 15); 
var rndY:Number = (Math.random() * 20 - 5); 
var rndX2:Number = rndX + (Math.random() * 20 - 15);
var rndY2:Number = rndY + (Math.random() * 20 - 5);
Asteroid5.x = rndX2;
Asteroid5.y = rndY2; or
var rndX:Number;
var rndY:Number;
for ( var i:uint=0; i<2; i++ )
{
   rndX += (Math.random() * 20 - 15);
   rndY += (Math.random() * 20 - 5);
}
Asteroid5.x = rndX;
Asteroid5.y = rndY;