2011-05-07 30 views
1

如果我得到一個隨機數,我該如何增加讓該隨機數變爲偶數的機會。我不想每次都做到這一點。我只是想要生成一個隨機數字,例如...%70的時間或%90的時間。增加偶數的機率

private function randNum (high, low) { 
     return Math.floor(Math.random() * (1+high-low)) + low; 
    } 

我會傳遞更大範圍的數字到這個函數嗎?或者我必須完全放棄這個功能?

謝謝

回答

4
private function randNum (high : Number, low : Number) : int 
{ 
    var even : Boolean = Math.random() < 0.7; //set probability of even number here 
    var rand : int = Math.floor(Math.random() * (1+high-low)) + low; 
    if (even) 
     while (rand % 2 != 0) 
      rand = Math.floor(Math.random() * (1+high-low)) + low; 
    else 
     while (rand % 2 != 1) 
      rand = Math.floor(Math.random() * (1+high-low)) + low; 
    return rand; 
} 

測試:

var even : int = 0; 
var odd : int = 0; 
for (var i : int = 0; i < 100000; i++) 
{ 
    var a : int = randNum(1, 20); 
    if (a % 2 == 0) 
     even++; 
    else 
     odd++; 
} 
trace(even, odd); 

輸出:

[trace] 69869 30131 
+0

輝煌Timofei,謝謝很多,這是完美的。 – 2011-05-07 13:15:58

+3

+1,因爲這是有效的,但如果你的範圍不包含任何偶數(或任何奇數),則最終可能會出現無限循環。其次,實際上不需要循環。例如,對於1到10之間的數字,對於奇數,選擇rand(1,5)並返回2 * n-1,對於偶數選擇rand(1,5)並返回2 * n。你只需要確保你適當地調整範圍。 – 2011-05-07 13:19:28

2

有點太晚了;),但另外一個沒有循環使用位掩碼操作:

會讓你的號碼偶數,則取決於(Math.random() >= evenProbability)結果設置低位爲1給予奇數

function randomRange(low:int, high:int, evenProbability:Number = 0.5):int{ 
    var ret:int = int(Math.random() * (1 + high - low)) + low 
    return (ret & -2) | int(Math.random() >= evenProbability) 
} 

這裏有wonderfl現場測試:http://wonderfl.net/c/9IHx