Вероятностные случайные числа? - PullRequest
0 голосов
/ 20 февраля 2012

Итак, у меня проблема.По сути, я не уделял достаточного внимания математике в старшей школе, и теперь я застрял.Мне нужно сгенерировать случайные числа от 1 до 20 с большим акцентом на одно от 5 до 5, с небольшим акцентом на 5-10 и низким акцентом на 10-20.Я не понимаю всех причудливых слов вероятности и всего, что они говорят в статьях, с которыми я сталкивался.Любая помощь, которую вы, ребята, можете предоставить, будет принята с благодарностью.Спасибо!

Ответы [ 3 ]

3 голосов
/ 20 февраля 2012

Вы можете использовать эту формулу для генерации случайного числа в диапазоне [низкий, высокий]:

var randomNumber:int = Math.floor(Math.random()*(1+high-low))+low;

Вы можете поместить это в функцию, если хотите.

Теперь,простой способ получить другую вероятность для трех предоставленных вами интервалов - сделать что-то вроде этого:

var random:Number = Math.random();
if (random < 0.75) {
    // generate random number in [1, 5]
} else if (random < 0.95) {
    // generate random number in [6, 10]
} else {
    // generate random number in [11, 20]
}
0 голосов
/ 21 февраля 2012

Я бы использовал одно из уравнений Пеннера. http://www.robertpenner.com/easing/

Создать число от 0 до 1. Отдайте его уравнению Пеннера, оно вернет число от 0 до 1. Умножьте это число на максимальное значение, которое вы хотите. Округлите его.

number = Math.round(MyTransformFunction(Math.random())*MaxNumber)

function MyTransformFunction(x){
   return x*x;
}

Любые другие функции, которые возвращают число от 0 до 1 для ввода от 0 до 1, будут работать:

return -x*x;
return Math.sqrt(x);
0 голосов
/ 20 февраля 2012

Вы также можете использовать что-то вроде строки ниже, если вам нужно «плавное» распределение.Т.е. распределение будет постепенно изменяться между самыми низкими и самыми высокими значениями с акцентом в приведенном ниже случае на более низкие значения.

    private function univenlyDistributedRandom(low:int, high:int):Number
    {
        return low + (1 - Math.pow(Math.random(), 4)) * (high - low);           
    }

Вы, конечно, можете использовать любую другую функцию (гиперболу или синус)и т. д.) для создания немного разных вариаций.Хотя одна забавная вещь.Если вы используете какой-либо движок твенинга - возможно, у вас уже есть такие функции!Любая функция замедления, которая не линейно применяется к выводу Math.random(), будет влиять на распределение "плавным" образом.Так, если, например, вы видите, что функция замедления делает что-то вроде «сначала идет медленно, но потом быстрее, быстрее и даже быстрее», это будет означать, что распределение, которое вы можете получить с помощью этого, будет смещено в сторонуменьшие числа и большие числа будут встречаться реже.

...