【问题标题】:Simulate coin toss for one week?模拟抛硬币一周?
【发布时间】:2012-06-24 20:25:45
【问题描述】:

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

例如:

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

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

【问题讨论】:

  • 你到底为什么要这样做?结果肯定取决于您计算机的机器速度吗?
  • 可以,如果你想让我帮你的话。
  • 把它放在一个检查系统时间的while循环中。
  • 运行这种类型的模拟是超自然研究中的标准程序,在这种情况下,您试图通过努力思考来迫使随机生成器变得疯狂。上次我尝试在 Windows 上实现可以被操纵,但 Linux 是稳定的(Dirk 会喜欢这个 :-)
  • @RSoul:我认为没有人真正向您提及的一个问题是,运行一周的“硬币翻转”是很多的硬币翻转。由于这些硬币翻转是由伪随机数生成器产生的,这取决于使用哪个数字生成器以及它是如何使用的,因此您可能在一周内循环遍历生成器的整个周期。换句话说,您的模拟可能会使用您计算机的所有伪随机性并重新开始重新使用它。

标签: r simulation probability coin-flipping


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    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
    

    警告说明:

    以我机器的速度,我敢打赌你会在一周结束前得到一个浮点错误long。换句话说,您可能会达到您的机器允许您存储为整数、双精度、浮点数或您正在使用的任何值的最大值,然后您的代码将崩溃。

    因此,您可能必须构建一些错误检查或翻转机制来保护您免受这种情况的影响。


    要快速说明会发生什么,请尝试以下操作:

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

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

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

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

    【讨论】:

    • 这与内存管理无关。它是关于计算机如何存储值的。在任何程序员手册中阅读有关整数和浮点值的信息,例如在en.wikipedia.org/wiki/Floating_point。在我的代码中,我只存储两个值。这永远不会耗尽内存。但是你可能仍然会得到一个浮点错误(或者任何 R 的等价物。)
    • 问题是值的向量太长了,我认为最大长度是2^31-1。您可以做的是偶尔保存并重置矢量。
    • 一个选项可能是不存储结果,而只存储摘要统计信息,即正面或反面的数量。
    • @RSoul 如果您不时将结果转储到文件中,那么您就很清楚了。
    • @RSoul - 我认为您可以在 while 循环中添加一些逻辑来检查向量的总长度。当它到达某个点时,将其写入文件,重置向量,然后重新开始。以现代计算机的速度,这可能是最后需要分析的大量数据......但我想你会弄清楚的。
    【解决方案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> }
    

    【讨论】:

    • 是的,但这肯定会在一周结束之前超过您计算机的内存。 OP 确实需要提供他们正在模拟的具体细节以获得完整的答案。
    • 在我看来这是 2 个问题。如何跑一周?如何处理内存问题,运行这个计算一周?如果你把这两个问题结合起来就该死,如果你不这样做该死。
    • 只需将每个值附加到文件中。由于唯一的要求是保持机器运行一周......
    • 是的,这是我的想法。会去研究一下。
    猜你喜欢
    • 1970-01-01
    • 2012-12-02
    • 2014-05-25
    • 2018-07-08
    • 1970-01-01
    • 2019-10-28
    • 2018-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多