模具总和的Monte-Carlo模拟

时间:2018-01-27 21:25:15

标签: julia montecarlo

我是编程新手,所以我提前为我缺乏知识而道歉。

我想找到投掷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.

据我所知,一般情况要复杂得多,但我只是想知道如何解决这个问题。提前感谢您的帮助。

2 个答案:

答案 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