r-R语言入门基础-抛硬币试验


r-R语言入门基础-抛硬币试验

1. 抛硬币的概率实验

  • 例题: 分别抛三枚硬币, 三枚硬币的图案可能使一样的,也可能是不一样的, 一样的老板给你3元,不一样你给老板3元,这个游戏公平吗?

显然不公平对吧? 同正或同反的概率是1/2 1/2 1/2 * 2 = 1/4, 这个游戏肯定玩过来是老板赚钱, 但是如果用R去算应该如何算呢?

假如我们玩100次游戏,0代表正面,1代表反面,那么同为0或同为1时是我们赢了,其他是输了,我们能赢或者输多少钱呢,100000次呢?

a <- sample(c(0,1), 3, rep=T)
a
## [1] 1 1 0

可以算sum值,如果是0说明同为正面,3说明同为反面,1或2说明我们输了

sum(a)
## [1] 2

我们重复100次

money = 0
for (i in 1:100){
  a = sample(c(0,1), 3, rep=T)
  if (sum(a)==0 | sum(a)==3){
    money = money + 3
  }else{
    money = money -3
  }
}
money
## [1] -108
money = 0
for (i in 1:100000){
  a = sample(c(0,1), 3, rep=T)
  if (sum(a)==0 | sum(a)==3){
    money = money + 3
  }else{
    money = money -3
  }
}
money
## [1] -150924

2. 接下来我们用table函数来看a的分布情况

mySum <- c()
for (i in 1:1000){
  a <- sample(c(0,1), 3, replace=T)
  mySum <- c(mySum,sum(a))
}
mySum
##    [1] 2 1 3 3 1 1 0 1 2 2 0 1 2 2 0 1 1 2 3 1 1 1 2 2 2 1 1 2 1 0 3 2 2 3 1 3 2
##   [38] 3 1 2 1 2 1 2 1 0 2 1 2 2 0 1 1 1 1 1 3 1 1 2 3 2 1 2 2 1 1 2 0 2 3 3 1 2
##   [75] 3 2 1 1 3 2 0 2 1 1 3 2 1 2 2 1 2 2 1 2 3 2 3 1 2 3 2 0 1 1 2 1 1 0 1 1 1
##  [112] 2 3 1 2 2 2 3 3 1 1 3 2 1 1 2 2 1 2 3 2 3 3 1 2 3 0 1 2 1 2 0 1 2 2 3 0 1
##  [149] 0 1 1 2 1 0 1 1 1 2 2 1 1 1 1 2 1 1 1 0 0 3 2 2 1 2 0 2 1 2 2 0 2 1 1 1 0
##  [186] 2 2 2 1 2 1 1 2 1 3 0 1 2 2 1 3 2 1 2 1 1 1 1 2 1 2 2 0 1 1 0 2 2 1 1 1 1
##  [223] 2 3 1 2 1 1 2 1 0 1 2 1 1 2 2 1 1 1 3 2 2 2 1 1 1 0 1 1 0 1 2 3 2 1 1 2 1
##  [260] 2 0 3 2 2 3 2 2 2 1 1 1 2 1 2 3 2 2 1 1 1 1 2 1 2 3 2 1 2 1 2 3 2 1 0 1 2
##  [297] 2 0 1 1 1 2 3 0 0 2 2 3 2 2 0 2 2 0 1 2 2 2 2 2 0 2 3 1 2 1 1 2 1 3 1 2 0
##  [334] 1 1 1 2 2 2 1 2 3 1 1 2 0 1 3 3 0 1 2 2 0 1 3 2 3 2 1 3 1 2 2 0 1 1 2 2 1
##  [371] 2 1 1 1 2 2 2 1 2 1 0 2 2 1 1 1 1 2 1 1 1 1 1 2 1 1 3 2 0 1 1 2 1 2 1 2 1
##  [408] 2 0 1 2 2 0 1 2 1 2 0 2 2 1 2 1 1 1 2 1 0 2 1 2 1 1 3 2 1 0 2 2 1 2 1 1 2
##  [445] 1 2 1 1 1 0 2 0 1 1 1 1 1 2 2 2 3 1 1 2 1 0 1 1 1 0 2 3 2 2 2 2 3 2 3 3 2
##  [482] 1 1 1 1 2 2 2 1 1 1 2 2 2 1 2 1 2 1 2 1 0 2 1 1 1 1 1 2 0 1 1 1 2 1 1 2 3
##  [519] 2 2 1 1 3 1 2 2 0 3 2 1 2 2 2 1 3 2 0 3 0 2 1 1 2 1 3 0 2 2 1 0 2 0 1 2 1
##  [556] 1 1 2 1 2 1 1 2 0 2 1 2 2 1 2 2 1 3 2 1 2 2 2 2 3 2 0 1 2 2 0 3 2 2 0 2 1
##  [593] 2 1 1 1 1 0 2 0 1 1 1 1 1 2 3 1 1 2 2 2 1 0 2 2 1 1 2 1 0 3 0 2 1 0 1 0 2
##  [630] 1 2 1 1 1 2 2 0 1 1 1 2 2 0 1 1 0 3 1 1 2 3 1 1 1 1 0 1 1 1 2 2 2 3 0 1 3
##  [667] 3 0 3 2 1 2 1 1 2 2 2 2 3 2 1 3 1 1 1 2 2 2 2 1 2 3 1 1 2 2 1 1 1 2 2 1 2
##  [704] 2 0 0 0 1 3 1 1 2 1 2 1 2 3 2 2 1 1 1 1 2 1 1 2 1 2 0 1 2 0 2 3 2 3 3 1 1
##  [741] 3 1 3 2 1 1 1 2 1 1 2 2 1 2 2 3 2 1 1 2 1 1 2 0 0 1 2 0 2 1 2 3 3 3 1 2 2
##  [778] 2 3 1 1 2 2 2 1 3 2 2 1 2 0 3 2 2 2 1 2 3 2 1 3 1 1 1 1 2 3 2 1 0 2 1 2 0
##  [815] 0 1 2 1 1 1 1 3 1 1 1 3 2 2 1 2 2 0 2 3 2 1 1 2 1 2 2 1 2 0 3 1 2 1 2 3 1
##  [852] 2 2 1 2 0 1 1 0 1 2 2 1 1 1 0 2 1 2 3 1 1 1 3 2 0 2 0 2 2 2 0 1 2 1 0 2 3
##  [889] 3 1 1 0 3 2 2 1 2 1 2 3 0 1 1 1 0 0 1 1 2 3 2 2 2 3 2 2 2 1 2 2 2 1 1 0 1
##  [926] 2 1 1 2 1 1 0 2 0 1 1 2 0 1 1 1 2 1 1 2 3 0 3 1 3 3 0 3 1 2 2 1 0 1 0 0 1
##  [963] 1 2 3 2 2 2 1 2 3 2 2 1 1 1 2 3 1 1 1 2 2 1 1 1 1 2 1 1 2 2 1 2 2 1 3 0 2
## [1000] 0
table(mySum)
## mySum
##   0   1   2   3 
## 111 406 370 113

所以table函数的功能是查看向量中值的分布情况 近似的去看也就是赚钱概率为(146+104)/1000 = 0.230 和理论预期值0.25相差不多,如果我们重复次数更多,就会更接近0,25

下面我们去访问table这个对象

x <- table(mySum)
x
## mySum
##   0   1   2   3 
## 111 406 370 113
x["0"] # 这是使用名称进行访问
##   0 
## 111
x[1] # 这是使用索引进行访问
##   0 
## 111

3. table转Dataframe

x
## mySum
##   0   1   2   3 
## 111 406 370 113
df <- as.data.frame(x)
df
##   mySum Freq
## 1     0  111
## 2     1  406
## 3     2  370
## 4     3  113

后面就也可以使用Dataframe的逻辑来进行运算