問題很簡單。我需要一行命令等,隨機數絕對1或-1
Math.round((-Math.random() * 2))
,其在輸出只是顯示和-1。我試圖找出它,但它似乎不是一件容易的事情!我可以使用IF命令,例如:
demo = (Math.random()>.5)?(1):(-1);
但我需要更快的東西,比如數學公式。
問題很簡單。我需要一行命令等,隨機數絕對1或-1
Math.round((-Math.random() * 2))
,其在輸出只是顯示和-1。我試圖找出它,但它似乎不是一件容易的事情!我可以使用IF命令,例如:
demo = (Math.random()>.5)?(1):(-1);
但我需要更快的東西,比如數學公式。
我無法想象任何比這更快的東西:
var n:int = ((Math.random()*4)&2)-1;
沒有條件語句,沒有比較,沒有比隨機():-)
等在這裏的功能是另外一個只是讓你覺得它是如何工作:
var n:int = (((Math.random()*0xFFFFFFFF) & 0x80000000)>>30) | 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
你知道,getTimer()函數會爲你節省很多輸入:D – divillysausages 2011-03-31 12:36:35
嘿!我不知道這一個!它一定是藏起來的:p無論如何,你都是在嘲笑我! – Kodiak 2011-03-31 13:17:04
您的第二行(三元運算符)是執行此操作的最快方法。如果你調用這個有很多,那麼你可以緩存喜歡的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];
}
Math.round(Math.random())*(maxValue-minValue+1))+minValue;
根據jonsca可以設置-1爲整一個問題...
如果你想有一個更快的方式,你可以做到這一點,因爲這:
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
..不錯的一個!謝謝 – 2011-03-31 10:09:42
在基準測試中試試這個:var n:int =((Math。random()* 0x7FFFFFFF)&2)-1; – 2011-03-31 16:39:56
0x7FFFFFFF沒有什麼特別的,實際上得到一個均勻的擴散,Math.random()應該乘以任何兩個4或更大的冪:4,8,16等...這樣的第二位是1經常是0. – 2011-03-31 16:51:03
var n:int = int(Math.random()*2) - 1 | 1;
..哇!這是好的! .. 謝謝.. : ) ,, – 2011-04-01 06:47:24