#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