gpt4 book ai didi

ruby - 掷 n 个骰子后得到特定和的概率。 ruby

转载 作者:数据小太阳 更新时间:2023-10-29 07:21:59 32 4
gpt4 key购买 nike

用 n 个骰子求滚动总和概率的最佳解决方案是什么?我正在通过查找来解决它

  1. 平均。
  2. 标准偏差。
  3. x 以下数字的 z_score>
  4. x 上面数字的 z_score
  5. 将两者都转换为概率
  6. 从另一个中减去一个

这是我到目前为止所做的。

# 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。这是正确的解决方案吗?

最佳答案

存在一个涉及二项式系数交替求和的精确解。我已经把它写在几个地方(在 QuoraMSE 上),你可以在别处找到它,尽管有一些有缺陷的版本。请注意,如果你实现它,你可能需要取消比最终结果大得多的二项式系数,如果你使用浮点运算,你可能会失去太多的精度。

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/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com