увеличивает шансы на получение четного числа

#actionscript-3 #math #actionscript

#actionscript-3 #математика #actionscript

Вопрос:

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

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

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

Спасибо

Ответ №1:

 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
  

Комментарии:

1. Блестящий Тимофей, большое спасибо, это идеально.

2. 1, поскольку это работает, но вы можете получить бесконечный цикл, если ваш диапазон не содержит четных чисел (или любых нечетных чисел). Во-вторых, на самом деле нет необходимости в цикле. Например, для чисел от 1 до 10, для нечетных чисел, выберите rand (1,5) и верните 2 * n-1, а для четных чисел выберите rand (1,5) и верните 2*n. Вам просто нужно убедиться, что вы соответствующим образом настроили диапазоны.

Ответ №2:

Немного поздновато 😉 но еще один вариант без цикла и с использованием операции битовой маскировки :

ret amp; -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 amp; -2 ) | int( Math.random() >= evenProbability )
}
  

Вот живой тест с wonderfl :http://wonderfl.net/c/9IHx