4

这不是功课。我有兴趣在 R 中设置抛硬币的模拟。我想运行一周的模拟。R 中是否有一个函数可以让我在一个时间段(例如一周)内开始和停止模拟?如果一切顺利,我可能想增加模拟期的长度。

例如:

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

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

4

3 回答 3

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.

因此,您在模拟中拥有的任何数据现在都丢失了。不可能在任何合理的程度上分析无穷大。

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

于 2012-06-22T14:23:47.477 回答
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> }
于 2012-06-22T14:24:52.220 回答
0

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

这可以让您按您的要求开始和停止模拟。

于 2012-06-22T19:24:46.390 回答