如果我得到一個隨機數,我該如何增加讓該隨機數變爲偶數的機會。我不想每次都做到這一點。我只是想要生成一個隨機數字,例如...%70的時間或%90的時間。增加偶數的機率
private function randNum (high, low) {
return Math.floor(Math.random() * (1+high-low)) + low;
}
我會傳遞更大範圍的數字到這個函數嗎?或者我必須完全放棄這個功能?
謝謝
如果我得到一個隨機數,我該如何增加讓該隨機數變爲偶數的機會。我不想每次都做到這一點。我只是想要生成一個隨機數字,例如...%70的時間或%90的時間。增加偶數的機率
private function randNum (high, low) {
return Math.floor(Math.random() * (1+high-low)) + low;
}
我會傳遞更大範圍的數字到這個函數嗎?或者我必須完全放棄這個功能?
謝謝
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
有點太晚了;),但另外一個沒有循環使用位掩碼操作:
會讓你的號碼偶數,則取決於(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
輝煌Timofei,謝謝很多,這是完美的。 – 2011-05-07 13:15:58
+1,因爲這是有效的,但如果你的範圍不包含任何偶數(或任何奇數),則最終可能會出現無限循環。其次,實際上不需要循環。例如,對於1到10之間的數字,對於奇數,選擇rand(1,5)並返回2 * n-1,對於偶數選擇rand(1,5)並返回2 * n。你只需要確保你適當地調整範圍。 – 2011-05-07 13:19:28