这不是家庭作业。我有兴趣在R中设置一个投掷硬币的模拟。我想将模拟运行一周。 R中是否有一个函数可以让我在一周的时间内启动和停止模拟?如果一切顺利,我可能希望增加模拟周期的长度。
例如:
x <- rbinom(10, 1, 1/2)
因此,为了澄清,而不是上面代码中的10,我如何保持模拟持续一周(一周的试验次数与试验次数)?感谢。
答案 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
感兴趣。它将任务分成几部分(这个想法是可以并行运行部分)。适用于您的问题的软件包的一部分是它缓存已经处理的部分的结果,因此如果任务被中断并重新启动,那么那些已经完成的部分将不会重新运行,但它会接受那些没有完成的部分(部分中断的部分将从该部分的开头开始)。
这可以让您按照要求启动和停止模拟。