Вы дали функцию плотности вероятности (P
для «вероятности»):
P(1) = 0.7
P(2) = 0.3
P(3) = 0.1
Вам нужно построить (кумулятивную) функцию распределения, которая выглядит так:
![Функция распределения](https://i.stack.imgur.com/tS0AD.jpg)
Теперь мы можем сгенерировать случайные числа от нуля до единицы, нанести их на ось Y
, провести линию вправо, чтобы увидеть, где они пересекаются с функцией распределения, а затем считать связанную координату X
как случайную переменную. Таким образом, если случайное число меньше 0,7, случайная величина равна 1
; если находится в диапазоне от 0,7 до 0,9, случайная величина равна 2
, а случайная величина равна 3
, если вероятность превышает 0.9
. (Обратите внимание, что вероятность того, что rand
будет точно равна 0.7
(скажем) точно, практически равна нулю, поэтому нам не нужно сожалеть о различиях между < 0.7
и <= 0.7
.)
Чтобы реализовать это, сначала вычислите хэш df
:
y = { 1 => 0.7, 2 => 0.2, 3 => 0.1 }
last = 0.0
df = y.each_with_object({}) { |(v,p),h| last += p; h[last.round(10)] = v }
#=> {0.7=>1, 0.9=>2, 1.0=>3}
И теперь мы можем создать случайную переменную следующим образом:
def rv(df)
rn = rand
df.find { |p,_| rn < p }.last
end
Давай попробуем:
def count(df,n)
n.times.each_with_object(Hash.new(0)) { |_,count|
count[rv(df)] += 1 }
end
n = 10_000
count(df,n)
#=> {1=>6993, 2=>1960, 3=>1047}
count(df,n)
#=> {1=>6986, 2=>2042, 3=>972}
count(df,n)
#=> {1=>6970, 2=>2039, 3=>991}
Обратите внимание, что порядок пар ключ-значение count
определяется результатами первых нескольких случайных переменных, поэтому ключи не обязательно будут в том порядке, в котором они здесь.
person
Cary Swoveland
schedule
06.03.2015
{ 1 => 0.7, 2 => 0.3}
. Когда мы выбираем случайный вес для 1, он будет больше 0,3 ровно в 4/7 случаев и, следовательно, определенно больше, чем число, которое мы выбираем для 2. Остальные 3/7 времени оно будет случайным. между 0,0 и 0,3 и имеют шанс 1/2 быть больше, чем число, которое мы выбираем для 2. Таким образом, оно заказывается первым в4/7 + (3/7)*(1/2) == 78.6%
случаев, тогда как его следует заказывать первым в 70% случаев. - person JKillian   schedule 06.03.2015rn = rand
(число между0.0
и1.0
), выбрать1
, еслиrn < 0.7
,2 if 0.7 <= rn < 0.9
и3
, если rn ‹= 0,9`. - person Cary Swoveland   schedule 06.03.2015