首页 > 解决方案 > 使用 R 进行硬币翻转模拟

问题描述

我试图模拟一个反复翻转的有偏见的硬币,直到连续出现 2 个正面或连续出现 2 个反面(然后翻转停止)。我想找到概率 P(连续两个头出现在连续两个尾之前)。

寻求将“尾巴”翻转到循环中的帮助。谢谢

 flip <- function(bias_p) {                           
    n_flips <- 0                                           
    head <- 0
    tail <- 0
    while (head != 2 & tail != 2) {                                 
       n_flips <- n_flips + 1
       head_flips <- sample(c(1,0), 1, prob = c(bias_p, 1 - bias_p))
       if(head_flips == 1) ((head <- head + 1) & (tail <- 0))
       else ((tail <- tail + 1) & (head <- 0))
       } 
    return(c(head, tail))
    }  
 y <- replicate(5000, flip(0.8))
 length(which(y[1,] ==2)) / (ncol(y)) 

标签: rstatisticssimulationprobabilitydistribution

解决方案


为了使您当前的方法起作用,我必须进行一些更改:

  • 每次迭代只生成一个翻转。目前,您每次迭代都会生成两个完全独立的随机结果 -hflip并且tflip可能彼此不一致
  • 如果翻转是一个头,添加nheads并重置ntails为 0
  • 如果翻转是尾巴,添加ntails并重置nheads

(使用{}for if/else可以更清楚逻辑流程是什么,你的电流else只接在它上面的那条线,不是第一次if测试)

coin_flip <- function(head_p) {                           
    nflips <- 0                                           
    nheads <- 0
    ntails <- 0
    while (nheads != 2 & ntails != 2) {                                 
        nflips <- nflips + 1
        # Only generate 1 flip
        flip <- sample(c(1,0),1,prob=c(head_p,1-head_p))
        # If heads:
        if (flip == 1) {
            nheads <- nheads + 1
            # Reset tails counter
            ntails <- 0
        # There are only two possibilities for what 'flip'
        # can be (1 or 0), so we can just use else rather than 
        # testing for 0 specifically
        } else {
           ntails <- ntails + 1
           nheads <- 0
        }
    } 
    return(nflips)
}

如果您需要该函数输出先出现 2 个正面还是 2 个反面,您可以替换return(nflips)return(nheads == 2):如果先出现 2 个正面,则该函数将输出 1,如果先出现 2 个反面,则输出 0。


推荐阅读