【问题标题】:Random number Absolute 1 or -1随机数 绝对 1 或 -1
【发布时间】:2011-07-26 16:32:35
【问题描述】:

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

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

,在输出中 只是 显示 1-1。我试图弄清楚,但这似乎不是一件容易的事!我可以使用 IF 命令,例如,

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

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

【问题讨论】:

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


    【解决方案1】:
    var n:int = int(Math.random()*2) - 1 | 1;
    

    【讨论】:

      【解决方案2】:

      我想不出比这更快的了:

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

      没有条件,没有比较,除了 random() 没有其他函数 :-)

      还有一个只是为了让你思考它是如何工作的:

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

      【讨论】:

        【解决方案3】:
        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
        

        【讨论】:

        • 你知道,getTimer() 函数可以为你节省很多打字时间:D
        • 嘿!我不知道这个!它一定是藏起来了 :p 反正你是在残忍地取笑我!
        【解决方案4】:

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

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

        它是如何工作的: Math.random()&gt;=0.5 将返回 truefalse

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

        &lt;&lt;1 会将值乘以 2,因此您有一个 int,即 20

        现在减去1.0,你有一个number,即1.0或-1.0

        这里有一些实时测试他们的速度:http://wonderfl.net/c/xdqv

        【讨论】:

        • 在你的基准测试中试试这个:var n:int = ((Math.random()*0x7FFFFFFF)&2)-1;
        • 0x7FFFFFFF 并没有什么特别之处,事实上,为了获得均匀分布,Math.random() 可能应该乘以 4 或更大的 2 的任何幂:4、8、16 等...这样第二位是 1 和 0 一样频繁。
        【解决方案5】:
        Math.round(Math.random())*(maxValue-minValue+1))+minValue;  
        

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

        【讨论】:

          【解决方案6】:

          您的第二行(三元运算符)是执行此操作的最快方法。如果您经常调用它,那么您可以缓存 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];
          }
          

          【讨论】:

            猜你喜欢
            • 2014-03-02
            • 1970-01-01
            • 1970-01-01
            • 2013-02-11
            • 2013-04-21
            • 1970-01-01
            • 2014-06-14
            • 2015-05-20
            相关资源
            最近更新 更多