我是编程新手,所以我提前为我缺乏知识而道歉。
我想找到投掷m die时获得总和k的概率。我不是在寻找直接的答案,我只是想问一下我是否走在正确的轨道上以及我可以改进的地方。
我从一个计算m die数组总和的函数开始:
function dicesum(m)
j = rand((1:6), m)
sum(j)
end
现在我正在尝试特定的值,看看我是否能找到一个模式(但没有太多运气)。我试过m = 2(两个死)。我想要做的是编写一个函数,检查两个骰子的总和是否为k,如果是,则计算概率。我的尝试非常天真,但我希望有人能指出我正确的方向:
m = 2
x, y = rand(1:6), rand(1:6)
z = x+y
if z == dicesum(m)
Probability = ??/6^m
我想以某种方式找到'元素的数量'在dicesum(2)中以计算概率。例如,考虑当dicesum(2)= 8时的情况。对于两个骰子,可能的结果是(2,6),(6,2),(5,3),(3,5),(4,4) ),(4,4)。概率为(2/36)* 3.
据我所知,一般情况要复杂得多,但我只是想知道如何解决这个问题。提前感谢您的帮助。
答案 0 :(得分:2)
如果我理解正确,你想使用模拟来估计在掷骰子时获得k之和的概率。我建议创建一个将k和m作为参数的函数,并重复模拟很多次。以下内容可帮助您入门:
function Simulate(m,k,Nsim=10^4)
#Initialize the counter
cnt=0
#Repeat the experiment Nsim times
for sim in 1:Nsim
#Simulate roll of m dice
s = sum(rand(1:6,m))
#Increment counter if sum matches k
if s == k
cnt += 1
end
end
#Return the estimated probability
return cnt/Nsim
end
prob = Simulate(3,4)
估计约为.0131。
答案 1 :(得分:1)
您还可以使用矢量化样式执行模拟,如下所示。它在内存分配方面效率较低,因为它创建了长度为Nsim的向量,而循环代码使用单个整数来计数,cnt。有时不必要的内存分配会导致性能问题。在这种情况下,事实证明矢量化代码的速度大约是其两倍。通常,循环更快一些。更熟悉朱莉娅内部的人可能会提供解释。
function Simulate1(m,k,Nsim=10^4)
#Simulate roll of m dice Nsim times
s = sum(rand(1:6,Nsim,m),2)
#Relative frequency of matches
prob = mean(s .== k)
return prob
end