模拟投掷硬币一周?

时间:2012-06-22 14:10:11

标签: r simulation probability coin-flipping

这不是家庭作业。我有兴趣在R中设置一个投掷硬币的模拟。我想将模拟运行一周。 R中是否有一个函数可以让我在一周的时间内启动和停止模拟?如果一切顺利,我可能希望增加模拟周期的长度。

例如:

x <- rbinom(10, 1, 1/2)

因此,为了澄清,而不是上面代码中的10,我如何保持模拟持续一周(一周的试验次数与试验次数)?感谢。

3 个答案:

答案 0 :(得分:11)

以下代码将继续运行三秒钟,然后停止并打印总计。

x <- Sys.time()
duration <- 3 # number of seconds
heads <- 0
tails <- 0

while(Sys.time() <= x + duration){
  s <- sample(0:1, 1)
  if(s == 1) heads <- heads+1 else tails <- tails+1
  cat(sample(0:1, 1))
}
cat("heads: ", heads)
cat("tails: ", tails)

结果:

001100111000011010000010110111111001011110100110001101101010 ...
heads:  12713
tails:  12836

警告提示:

以我的机器速度,我打赌你在本周结束之前得到浮动点错误。换句话说,您可以获得机器允许您存储为整数,双精度,浮点数或其他任何内容的最大值,然后您的代码将崩溃。

因此,您可能需要构建一些错误检查或翻转机制来保护您免受此攻击。


要加快说明会发生什么,请尝试以下方法:

x <- 1e300
while(is.finite(x)){
  x <- x+x
  cat(x, "\n")
}

R优雅地处理浮点重载,并返回Inf

因此,您在模拟中获得的任何数据现在都会丢失。无法将无穷大分析到任何合理的程度。

设计模拟时请记住这一点。

答案 1 :(得分:3)

虽然现在小于一周后时间戳附加到x rbinmo(1,1,1/2)

R> week_later <- strptime("2012-06-22 16:45:00", "%Y-%m-%d %H:%M:%S")
R> x <- rbinom(1, 1, 1/2) // init x
R> while(as.numeric(Sys.time()) < as.numeric(week_later)){
R>   x <- append(x, rbinom(1, 1, 1/2))
R> }

答案 2 :(得分:0)

您可能对Andrew Redd的新版程序包harvestr感兴趣。它将任务分成几部分(这个想法是可以并行运行部分)。适用于您的问题的软件包的一部分是它缓存已经处理的部分的结果,因此如果任务被中断并重新启动,那么那些已经完成的部分将不会重新运行,但它会接受那些没有完成的部分(部分中断的部分将从该部分的开头开始)。

这可以让您按照要求启动和停止模拟。