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
Flash 随机数绝对值1或-1_Flash_Actionscript 3_Math_Random_Mathematical Optimization - Fatal编程技术网

Flash 随机数绝对值1或-1

Flash 随机数绝对值1或-1,flash,actionscript-3,math,random,mathematical-optimization,Flash,Actionscript 3,Math,Random,Mathematical Optimization,问题很简单。我需要一行命令,比如 Math.round((-Math.random() * 2)) demo = (Math.random()>.5)?(1):(-1); ,它在输出中仅显示1和-1。我想弄明白,但这似乎不是一件容易的事!如果命令是这样的,我可以使用 Math.round((-Math.random() * 2)) demo = (Math.random()>.5)?(1):(-1); 但我需要更快的东西,比如数学公式 Math.round(Math.rand

问题很简单。我需要一行命令,比如

Math.round((-Math.random() * 2))
demo = (Math.random()>.5)?(1):(-1);
,它在输出中仅显示1-1。我想弄明白,但这似乎不是一件容易的事!如果命令是这样的,我可以使用

Math.round((-Math.random() * 2))
demo = (Math.random()>.5)?(1):(-1);
但我需要更快的东西,比如数学公式

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
var-referenceTime:int=getTimer();
var-randomInt:int;
对于(变量i:int=0;i<1000000;i++)
{
randomInt=(Math.random()>.5)?1:-1;
}
跟踪(getTimer()-referenceTime)//122ms
referenceTime=getTimer();
对于(i=0;i<1000000;i++)
{
randomInt=Math.round(Math.random())*2-1;
}
跟踪(getTimer()-referenceTime)//238ms
第二行(三元运算符)是实现这一点的最快方法。如果经常调用此函数,则可以缓存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];
}
private var m_nums:Vector.=无效的
私人var m_总计:int=100;
私有var m_curr:int=0;
私有函数_init():void
{
this.m_nums=新向量。(this.m_总计,真);
var ran:Function=Math.random;
对于(变量i:int=0;i0.5)?1:-1;
}
公共函数getRandom():int
{
这个.m_curr++;
如果(本币>=本币总计)
该单位货币=0;
返回此.m_nums[此.m_curr];
}

根据jonsca的说法,将-1设置为整数可能是一个问题…

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

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

我想象不出比这更快的事情了:

var n:int = ((Math.random()*4)&2)-1;
除了random()之外,没有条件、比较、函数:-)

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

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

你知道,getTimer()函数可以为你节省很多输入:DHey!我不知道这个!它一定是藏起来了:p不管怎样,你在残酷地取笑我!在你的基准测试中试试这个:var n:int=((Math.random()*0x7fffff)&2)-1;0x7FFFFFFF没有什么特别之处,事实上,为了得到均匀的排列,Math.random()可能应该乘以4或更大的2的任意幂:4、8、16等等。。。使第二位的频率为1和0。
var n:int = int(Math.random()*2) - 1 | 1;