问题很简单。我需要一个像
这样的行命令Math.round((-Math.random() * 2))
,输出只是显示 1 和 -1 。我试图解决它,但这似乎不是一件容易的事!我可以使用IF命令,
demo = (Math.random()>.5)?(1):(-1);
但我需要更快的东西,比如数学公式。
答案 0 :(得分:6)
如果您想要更快的方式,可以这样做:
var n:Number=(int(Math.random()>=0.5)<<1)-1.0
工作原理:
Math.random()>=0.5
将返回true
或false
int(true) = 1
int(false) = 0
<<1
会将该值乘以2,因此int
或2
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;