- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
用 n 个骰子求滚动总和概率的最佳解决方案是什么?我正在通过查找来解决它
x
以下数字的 z_score>x
上面数字的 z_score 这是我到目前为止所做的。
# 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。这是正确的解决方案吗?
最佳答案
存在一个涉及二项式系数交替求和的精确解。我已经把它写在几个地方(在 Quora 和 MSE 上),你可以在别处找到它,尽管有一些有缺陷的版本。请注意,如果你实现它,你可能需要取消比最终结果大得多的二项式系数,如果你使用浮点运算,你可能会失去太多的精度。
Neil Slater 关于使用动态规划计算卷积的建议是一个很好的建议。它比二项式系数的求和慢,但相当稳健。您可以通过几种方式加快速度,例如通过平方求幂,以及使用快速傅里叶变换,但很多人会发现这些方法太过分了。
要修复您的方法,您应该使用(简单的)连续性校正来对正态近似进行修正,并限制在您有足够骰子的情况下,并且您的评估距离您期望正态近似的最大值和最小值足够远好,无论是绝对的还是相对的。连续性校正是将 n 的计数替换为从 n-1/2 到 n+1/2 的区间。
总共掷出 200 的方法数的精确计数是 7745954278770349845682110174816333221135826585518841002760,所以概率是除以 6^100,大约是 1.18563 x 10^-20。
具有简单连续性校正的正态近似为 Phi((200.5-350)/sqrt(3500/12))-Phi((199.5-350)/sqrt(3500/12)) = 4.2 x 10^-19 .这在绝对值上是准确的,因为它非常接近于 0,但它偏离了 35 倍,因此相对而言并不是很好。正态近似给出了更接近中心的更好的相对近似。
关于ruby - 掷 n 个骰子后得到特定和的概率。 ruby ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31883165/
用 n 个骰子求滚动总和概率的最佳解决方案是什么?我正在通过查找来解决它 平均。 标准偏差。 x 以下数字的 z_score> x 上面数字的 z_score 将两者都转换为概率 从另一个中减去一个
我的教授要求我们编写一个程序: 使用循环模拟一对骰子的滚动一千次(这里我认为 for 循环会很有用)。 对于每次迭代,循环需要计算每个值从 2 到 12 的次数(这里我认为 if/else 语句适用)
我一周前才开始使用 python,现在我被掷骰子的问题困住了。这是我 friend 昨天发给我的问题,我自己也不知道怎么解决。 Imagine you are playing a board game
从头开始,用 2 个骰子重复第 4 部分。这次我们使用 10,000 而不是 1000。 每个骰子的数字可以为 1 - 6,因此 2 个骰子的总数必须在 2 - 12 的范围内。 您的输出将在 2 –
我想计算 n 个骰子的所有眼睛的总和与 s 面(编号从 1 到 s) 等于 t。我的语言是 Python 3。 我目前的方法几乎是一种尝试计数的解决方案,只适用于小数字(运行 probability(
我是一名优秀的程序员,十分优秀!