模拟抛硬币

时间:2015-10-19 13:16:29

标签: r loops

New York Times yesterday中,有人提到一篇论文,主要是说“头”出现后'头'的概率不是0.5(假设一个公平的硬币),挑战“热手”神话。我想向自己证明一下。

因此,我正在编写7个硬币投掷的模拟,并计算第一个头后的头数,自然地提供了第一个头。

我提出了以下R代码行,但我仍然获得NA值,并希望得到一些帮助:

n <- 7              # number of tosses
p <- 0.5            # probability of heads
sims <- 100         # number of simulations

Freq_post_H <- 0    # frequency of 'head'-s after first 'head' 
    for(i in 1:sims){
        z <- rbinom(n, 1, p)
        if(sum(z==1)!=0){
        y <- which(z==1)[1]
        Freq_post_H[i] <- sum(z[(y+1):n])/length((y+1):n) 
        }else{
            next()
        }
    Freq_post_H
    }
Freq_post_H

我错过了什么?

结论:在不匹配的变量名称的初始打嗝之后,两个响应都解决了这个问题。其中一个答案通过引入(i + 1)来纠正初始代码中与上次折腾min(y + 1, n)相关的问题,并纠正生成next的循环中NA的基本误解。用于跳过迭代。谢谢(+1)。

重要的是,这个附加“结论”的原因是第二个响应解决了一个更基本或概念性的问题:我们想要计算H前面的H的分数,而不是p(H)。头部出现后仍然存在投掷的数量,对于一个公平的硬币,这将是0.5。

4 个答案:

答案 0 :(得分:2)

这是他们在报纸上所做的模拟:

nsims <- 10000
k <- 4
set.seed(42)
sims <- replicate(nsims, {
  x <- sample(0:1, k, TRUE)
  #print(x)
  sum( # sum logical values, i.e. 0/1
   diff(x) == 0L & # is difference between consecutive values 0? 
     x[-1] == 1L ) / # and are these values heads? 
       sum(head(x, -1) == 1L) #divide by number of heads (without last toss)
})

mean(sims, na.rm = TRUE)  #NaN cases are samples without heads, i.e. 0/0
#[1] 0.4054715

k <- 7

sims <- replicate(nsims, {
  x <- sample(0:1, k, TRUE)
  #print(x)
  sum(diff(x) == 0L & x[-1] == 1L) / sum(head(x, -1) == 1L) 
})

mean(sims, na.rm = TRUE) 
#[1] 0.4289402

答案 1 :(得分:1)

n <- 7              # number of tosses
p <- 0.5            # probability of heads
sims <- 100         # number of simulations

Prob_post_H <- 0    # frequency of 'head'-s after first 'head' 
    for(i in 1:sims){
        z <- rbinom(n, 1, p)
        if(sum(z==1) != 0){
        y <- which(z==1)[1]
        Prob_post_H[i] <- mean(z[min(y+1, n):n], na.rm=TRUE)
        }else{
            next()
        }
    }
mean(Prob_post_H,na.rm=TRUE)
#[1] 0.495068

看起来好像是50%左右。我们可以扩展以查看更多模拟。

sims <- 10000

mean(Prob_post_H,na.rm=TRUE)
#[1] 0.5057866

仍然约为50%。

答案 2 :(得分:0)

这是模拟100次公平投币30,000次

counter <- 1 
coin <- sum(rbinom(100,1,0.5)) 
while(counter<30000){
  coin <- c(coin, sum(rbinom(100,1,0.5)))
  counter <- counter+1
}

在变量

上面运行后尝试这些
 hist(coin)
 str(coin)
 mean(coin)
 sd(coin)

答案 3 :(得分:0)

下面是R中的一些示例代码,以使用示例函数来模拟R中的公平投币。您可以根据需要进行修改,以模拟任意数量的翻转。由于掷硬币的结果与每次掷硬币无关,因此对于任何给定的掷硬币而言,正面或反面的概率始终为0.5。在许多硬币翻转中,至少有一半翻转的概率为正面(或反面)收敛到0.5。正好有一半的头和一半的尾巴的概率接近0。

n <- 7
count_heads <- 0
coin_flip <- sample(c(0,1), n, replace = TRUE)
for(flip_i in 1:n)
{
  if(coin_flip[flip_i] == 1)
  {
    count_heads = count_heads + 1
  }
}
count_heads/n