увеличить шансы на четное число - PullRequest
1 голос
/ 07 мая 2011

Если я получаю случайное число, как мне увеличить мои шансы сделать это случайное число четным?Я не хочу делать это даже каждый раз.Я просто пытаюсь сгенерировать случайное число, скажем ...% 70 времени или% 90 времени.

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

Я бы передал больший диапазон чисел этой функции?Или мне пришлось бы вообще отказаться от этой функции?

Спасибо

Ответы [ 2 ]

4 голосов
/ 07 мая 2011
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
2 голосов
/ 07 мая 2011

Слишком поздно;) но еще один без цикла и с использованием операции маскирования битов:

ret & -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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...