Julia 模具总尺寸的montecarlo模拟

Julia 模具总尺寸的montecarlo模拟,julia,montecarlo,Julia,Montecarlo,我对编程非常陌生,所以我提前为自己的知识不足道歉 我想找出当掷骰子时得到和k的概率。我不是在寻找一个直接的答案,我只是想问我是否在正确的轨道上,我可以改进什么 我从一个函数开始,该函数计算m个骰子数组的和: function dicesum(m) j = rand((1:6), m) sum(j) end 现在我正在尝试特定的值,看看是否能找到一个模式(但运气不好)。我试过m=2(两个骰子)。我想做的是写一个函数,它检查两个骰子的和是否为k,如果是,它计算概率。我的尝试很幼稚,但我希望有人能给

我对编程非常陌生,所以我提前为自己的知识不足道歉

我想找出当掷骰子时得到和k的概率。我不是在寻找一个直接的答案,我只是想问我是否在正确的轨道上,我可以改进什么

我从一个函数开始,该函数计算m个骰子数组的和:

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)中“元素”的数量。例如,考虑当DeSeSUM(2)=8时的情况。对于两个骰子,可能的结果是(2,6),(6,2),(5,3),(3,5),(4,4),(4,4)。概率为(2/36)*3


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

如果我理解正确,您希望使用模拟来近似掷m骰子时获得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)

估计约为0.0131

您还可以按如下所示的矢量化样式执行模拟。它在内存分配方面效率较低,因为它创建了长度为Nsim的向量s,而循环代码使用单个整数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

哇,太棒了!我还得再读几遍才能完全理解它,但我想我明白你想做什么了。只有一个问题:我见过几个蒙特卡罗模拟的例子,其中使用了
cnt=0
count=0
。但我不太明白这里为什么用它。我们不是简单地在1:Nsim中循环所有的
sim卡吗?忽略上面的评论,我理解你所做的。再次感谢您的帮助:)原因是第一个解决方案将一个小数组分配10^4次,这非常昂贵。分配一次大数组,然后将其聚合。如果使用以下代码
s=0计算
s
,则原始解决方案将更快;对于1:m s+=rand(1:6)end中的i,因为这样可以避免分配。您可以使用
@benchmark
宏检查所有这些。如果将
rand(1:6)
替换为
ceil(Int,6rand())
,则仍可以提高模拟速度-这是以最小的精度损失为代价的,请参阅。