2011-03-31 64 views
3

問題很簡單。我需要一行命令等,隨機數絕對1或-1

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

,其在輸出只是顯示和-1。我試圖找出它,但它似乎不是一件容易的事情!我可以使用IF命令,例如:

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

但我需要更快的東西,比如數學公式。

回答

4

我無法想象任何比這更快的東西:

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

沒有條件語句,沒有比較,沒有比隨機():-)

等在這裏的功能是另外一個只是讓你覺得它是如何工作:

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

..哇!這是好的! .. 謝謝.. : ) ,, – 2011-04-01 06:47:24

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 
+0

你知道,getTimer()函數會爲你節省很多輸入:D – divillysausages 2011-03-31 12:36:35

+0

嘿!我不知道這一個!它一定是藏起來的:p無論如何,你都是在嘲笑我! – Kodiak 2011-03-31 13:17:04

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]; 
} 
1
Math.round(Math.random())*(maxValue-minValue+1))+minValue; 

根據jonsca可以設置-1爲整一個問題...

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的值,讓你有一個int20

現在。減去1.0,你有一個number1.0或 - 1.0

這裏一些現場測試他們的速度:http://wonderfl.net/c/xdqv

+0

..不錯的一個!謝謝 – 2011-03-31 10:09:42

+0

在基準測試中試試這個:var n:int =((Math。random()* 0x7FFFFFFF)&2)-1; – 2011-03-31 16:39:56

+0

0x7FFFFFFF沒有什麼特別的,實際上得到一個均勻的擴散,Math.random()應該乘以任何兩個4或更大的冪:4,8,16等...這樣的第二位是1經常是0. – 2011-03-31 16:51:03