Распределение вероятностей вперед случайных чисел - PullRequest
6 голосов
/ 13 августа 2011

Скажем, я псевдослучайно выбираю число от 1 до 50 каждую секунду в течение 100 секунд, и с течением времени выбранное число с большей вероятностью будет больше.Как я могу структурировать такой алгоритм?

Например: через 99 секунд вероятность выбора числа ближе к 50 гораздо выше, чем выбор числа ближе к 1.

Или:число, выбранное через 10 секунд, более вероятно, будет больше, чем число, выбранное через 9 секунд

Ответы [ 4 ]

5 голосов
/ 13 августа 2011

Выберите любую вогнутую монотонную функцию, такую ​​как квадратный корень, который отображает от 0 до 0 и от 1 до 1. Создайте случайное число между [0,1], примените функцию и затем растяните [0,1] до желаемого интервала ([1, 50]).

Теперь, если вы перейдете от линейного преобразования f (x) = x к упомянутой функции преобразования, например, с помощью простого взвешивания, вы получите желаемый эффект.

4 голосов
/ 13 августа 2011

У меня есть простое решение для вас.Вместо rand(1, 50) (скажем, эта функция генерирует равномерно случайные числа 1..50) используйте это выражение:

power(rand(1, power(50, exp)), 1/exp)

это все равно даст вам все числа 1..50.Для exp = 1 распределение будет равномерным.По мере того, как вы немного увеличиваете exp (например, как 1.1 или около того), вероятность получения больших чисел будет увеличиваться.Чем выше опыт, тем больше он будет увеличиваться до 50.

Таким образом, вы можете сделать, например:

factor = 1 /* finetune this for your needs */
for second = 0..100
    exp = 1 + (second / 100) * factor
    rand_num = power(rand(1, power(50, exp)), 1/exp)
endfor
1 голос
/ 13 августа 2011

Псевдокод:

let i = 0
let n = 50 // Adjust for your needs
for i goes to 100 {
  randomnum = int(sqrt(rand(1, 50*n)));
}

Это может быть очень ориентировано на будущее, но это один из способов приблизиться к нему.

Спасибо Рики Бобби за то, что он указал на фундаментальную проблему с моим старым подходом,Это вдохновлено предложением yi_H использовать функцию наподобие sqrt.

0 голосов
/ 13 августа 2011

Вероятно, существуют более простые способы для того, что вы делаете, но общее решение заключается в использовании выборки обратного преобразования .

По существу, если вы хотите получить случайное число сучитывая PDF, p (x) , вы сначала рассчитываете обратную функцию накопленной плотности (CDF), P '(x) .Затем вы можете сгенерировать случайные числа от 0 до 1, а затем применить к ним P '(x) .

...