【问题标题】:Monte Carlo Simulations: Probability that 5 consecutive rolls of seven will occur蒙特卡洛模拟:发生 5 次连续滚动 7 次的概率
【发布时间】:2016-07-03 06:25:09
【问题描述】:

我只需要您对蒙特卡洛模拟的帮助。这就是问题所在。

在掷出两个骰子时,共有 7 个出现,概率为 1/6。 在 100 次骰子中,有 5 次的概率是多少 会出现连续的七卷吗?

(这是 M. Meerschaert 的数学建模和模拟练习)

我用 R 做了一个伪代码:

dice.sims1 = function(trials){
occur
for (j in 1:trials){
x = 0
y = 0
n = 0
result = NULL
while (n<100){
n = n+1
result[n] = sample(1:6,1) + sample(1:6,1)
if(result[n] == 7){
x = x+1
}else {x = 0}
if(x>=5){
y = y+1
}
}
occur[j] = y 
}
print(mean(occur)/100)
}

这是正确的吗?如果是这样,我如何解释我的结果? 如果不正确,可以帮我改正吗?

谢谢,祝你有美好的一天。

【问题讨论】:

  • 真的吗?第二行 occur 在做什么?除非在您没有显示给我们的代码中声明,否则会产生错误Error in dice.sims1(10000) : object 'occur' not found
  • 不管怎样,模数不明确的问题(5 in a row 到底是怎么定义的?),经过一些修改看起来还可以,请检查答案
  • 我忘了设置发生 = NULL,先生。对不起。但在我编辑的代码中,我可以运行。
  • 请不要叫我先生,这让我很紧张......
  • 先生,我对我之前的代码感到非常抱歉。无论如何,我能够在设置发生 = NULL 后运行它。关于连续 5 次,我在下面解释了我的论点,为什么我将 6 次连续的 7 视为两次。我也不清楚我们是否应该将其算作一两个,但这就是我将为我的答案辩护的方式。非常感谢您,先生。

标签: simulation probability modeling montecarlo


【解决方案1】:

除了代码中的错误之外,还有一个不清楚的条件 - 如果您连续 6 次掷出 7,它是算作一还是算二?

这里算两个

if(x>=5){
    y = y+1
}

然后连续滚动 7 次就会变成 3 次,以此类推。

更新

dice.sims1 = function(trials) {
    occur = rep(0, times=trials)
    for (j in 1:trials) {
        x = 0
        y = 0
        n = 0
        while (n<100) {
            n = n + 1
            result = sample(1:6,1) + sample(1:6,1)
            if(result == 7){
                x = x+1
            } else {
                x = 0
            }
            if(x>=5) {
                y = y+1
                x = 0 # !!! unclear problem setup
            }
        }
        occur[j] = y
    }
    mean(occur)
}

set.seed(12345)

print(dice.sims1(10000))

将产生 0.0109 带标记线和 0.0131 带标记线删除

更新二

没有数组的版本,直接求和

dice.sims <- function(trials) {
    s <- 0L
    for (i in 1:trials) {

        ncons <- 0L
        for(k in 1:100) {
            roll <- sample.int(6,1) + sample.int(6,1)
            if (roll == 7L) {
                ncons <- ncons + 1L # good roll
            } else {
                ncons <- 0L # bad one, back to square one
            }
            if (ncons >= 5L) {
                s <- s + 1L
                # ncons <- 0L # start from the beginning
            }
        }
    }
    as.numeric(s)/as.numeric(trials)
}

【讨论】:

  • 如果你连续有 6 个 7 卷,算一还是算二? 好吧,先生,我算了。我在想,如果我将第二个 7 视为第一个,将第三个 7 视为第二个,...,将第六个 7 视为第五个,那么我可以观察到另外 5 个连续的 7 连续滚动。先生,set.seed(12345) 对代码有什么作用?我想你的答案是百分比?我们的答案不同,因为我将我的答案除以 100(以获得在 100 卷中连续 5 卷 7 卷的概率)
  • @raffycee set.seed(12345) 正在设置随机数生成器的种子值,从而使结果可重现。
  • @raffycee 好的,所以在我的代码行中标有感叹号被删除。我的结果是概率,但每次试验/运行 100 卷时归一化,而不是您所暗示的每 1 卷。你得到了什么?
  • 我明白了。我的在 dice.sims1(1000000) 大约是 0.000124。可能是因为我把它除以 100?
  • @raffycee 是的,我认为非常接近,但 1/100 的除法不同。你能在你的代码中调用 set.seed(12345) 看看你得到了什么吗?
猜你喜欢
  • 1970-01-01
  • 2021-01-06
  • 1970-01-01
  • 2018-09-24
  • 2018-04-03
  • 1970-01-01
  • 2017-06-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多