随机数绝对1或-1

时间:2011-03-31 07:54:47

标签: flash actionscript-3 math random mathematical-optimization

问题很简单。我需要一个像

这样的行命令
Math.round((-Math.random() * 2))

,输出只是显示 1 -1 。我试图解决它,但这似乎不是一件容易的事!我可以使用IF命令,

demo = (Math.random()>.5)?(1):(-1);

但我需要更快的东西,比如数学公式。

6 个答案:

答案 0 :(得分:6)

如果您想要更快的方式,可以这样做:

var n:Number=(int(Math.random()>=0.5)<<1)-1.0

工作原理: Math.random()>=0.5将返回truefalse

int(true) = 1
int(false) = 0

<<1会将该值乘以2,因此int2

0

现在减去1.0,你有number 1.0或 - 1.0

这里有一些现场测试速度:http://wonderfl.net/c/xdqv

答案 1 :(得分:4)

Math.round(Math.random())*2-1;

但说实话,它比条件方法慢。

var referenceTime:int = getTimer();
var randomInt:int;
for (var i:int=0; i < 1000000; i++)
{
    randomInt = (Math.random()>.5)?1:-1;
}

trace(getTimer()-referenceTime);  //122ms
referenceTime = getTimer();

for (i=0; i < 1000000; i++)
{
    randomInt = Math.round(Math.random())*2-1;
}

trace(getTimer()-referenceTime);   //238ms

答案 2 :(得分:4)

我无法想象比这更快的事情:

var n:int = ((Math.random()*4)&2)-1;

没有条件,没有比较,除了random()之外没有其他功能: - )

这是另一个让你思考它是如何工作的:

var n:int = (((Math.random()*0xFFFFFFFF) & 0x80000000)>>30) | 1;

答案 3 :(得分:3)

您的第二行(三元运算符)是执行此操作的最快方法。如果你经常调用它,那么可以缓存Math.random()函数,如:

private var m_ran:Function = Math.random;

或者对于绝对最快的访问,您可以预生成100(或1000,无论如何)结果的数组,然后在需要时遍历列表。类似的东西:

private var m_nums:Vector.<int> = null;
private var m_total:int         = 100;
private var m_curr:int          = 0;

private function _init():void
{
    this.m_nums         = new Vector.<int>( this.m_total, true );
    var ran:Function    = Math.random;
    for( var i:int = 0; i < total; i++ )
        this.m_nums[i] = ( ran() > 0.5 ) ? 1 : -1;
}

public function getRandom():int
{
    this.m_curr++;
    if( this.m_curr >= this.m_total )
        this.m_curr = 0;
    return this.m_nums[this.m_curr];
}

答案 4 :(得分:1)

Math.round(Math.random())*(maxValue-minValue+1))+minValue;  

根据jonsca将-1设置为整数可能是个问题...

答案 5 :(得分:1)

var n:int = int(Math.random()*2) - 1 | 1;