r - 使用 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))
解决方案
为了使您当前的方法起作用,我必须进行一些更改:
- 每次迭代只生成一个翻转。目前,您每次迭代都会生成两个完全独立的随机结果 -
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。
推荐阅读
- c++ - 派生类的C++重写成员函数返回派生类的数组
- matlab - 使用与地面实况定义相同的颜色为集群着色以进行可视化
- jquery - Django - AJAX POST 到 API 不起作用但没有错误
- jquery - SharePoint 客户端人员选取器组 ID
- linux - 如何解决 gfortran Linux 中的“无参考”错误?
- python - 在 VSCode 中运行网络爬虫,出现错误:无法从堆栈溢出中恢复
- python - 如何阻止字母以阻止崩溃
- c# - 对 ObservableCollection 进行排序
列表框中的数据 - apache-spark - 将 spark 数据帧转换为 aws 胶水动态帧
- c# - EF Core 中的条件包含