Какое наилучшее решение для нахождения вероятности прокатки суммы с n кубиками? Я решаю это, найдяВероятность получения конкретной суммы после прокатки n кубиков. Ruby
- средний.
- стандартное отклонение.
- z_score для чисел ниже
x
- z_score для чисел выше
x
- преобразования как для вероятностей
- вычитая одно из другого
Это то, что я сделал до сих пор.
# sides - number of sides on one die
def get_mean(sides)
(1..sides).inject(:+)/sides.to_f
end
def get_variance(sides)
mean_of_squares = ((1..sides).inject {|sum, side| sum + side ** 2})/sides.to_f
square_mean = get_mean(sides) ** 2
mean_of_squares - square_mean
end
def get_sigma(variance)
variance ** 0.5
end
# x - the number of points in question
def get_z_score(x, mean, sigma)
(x - mean)/sigma.to_f
end
# Converts z_score to probability
def z_to_probability(z)
return 0 if z < -6.5
return 1 if z > 6.5
fact_k = 1
sum = 0
term = 1
k = 0
loop_stop = Math.exp(-23)
while term.abs > loop_stop do
term = 0.3989422804 * ((-1)**k) * (z**k)/(2*k+1)/(2**k) * (z**(k+1))/fact_k
sum += term
k += 1
fact_k *= k
end
sum += 0.5
1 - sum
end
# Calculate probability of getting 'х' total points by rolling 'n' dice with 'sides' number of sides.
def probability_of_sum(x, n, sides=6)
mean = n * get_mean(sides)
variance = get_variance(sides)
sigma = get_sigma(n * variance)
# Rolling below the sum
z1 = get_z_score(x, mean, sigma)
prob_1 = z_to_probability(z1)
# Rolling above the sum
z2 = get_z_score(x+1, mean, sigma)
prob_2 = z_to_probability(z2)
prob_1 - prob_2
end
# Run probability for 100 dice
puts probability_of_sum(400, 100)
Что касается меня, когда я выбираю x = 200
вероятность равна 0. ли это правильное решение?
Если я правильно понял .. нет. Если вы будете качать все 2 100, общее количество будет 200. Таким образом, есть вероятность, что это произойдет. – mtamhankar
Вот что я тоже думал.Однако, согласно [68-95-99.7 (эмпирическому) правилу] (https://en.wikipedia.org/wiki/68%E2%80%9395%E2%80%9399.7_rule), или правило 3-сигмы «Около ** 68% ** значений, полученных из нормального распределения, находятся в пределах ** 1 ** стандартное отклонение _σ_ от среднего значения, около ** 95% ** значений лежат в пределах ** 2 ** стандартных отклонений; и около ** 99,7% ** находятся в пределах ** 3 ** стандартных отклонений. " В этом случае с ** 100 ** 6-сторонними кубиками 'mean = 350' и' σ = 17'. Это означает, что ** 99,7% ** значений будет находиться в диапазоне ** 299 ** до ** 401 **. (350 +/- 17 * 3) – Pav31
Также примечание: в алгоритме есть что-то принципиально неправильное, запустив что-то очень простое, например x = 12 и n = 2, которое должно быть 1/36, не работает. Я думаю, что @NeilSlater может быть связан с чем-то вроде дискретности. – mtamhankar