【问题标题】:Count number of alternations in a coin flip sequence计算硬币翻转序列中的交替次数
【发布时间】:2011-04-09 16:19:10
【问题描述】:

我有一个 1 和 0 的序列,我想计算交替的次数。例如

x <- rbinom(10, 1, 1/2)
> x
 [1] 0 0 1 1 1 1 1 0 1 0

因此,我想计算(在 R 中)序列从 1 到 0 交替(或翻转)的次数。在上述序列中,交替次数(手动计数)为 4。

【问题讨论】:

  • 这不是家庭作业。这是我自己的研究,不幸的是我几乎没有数学素养!

标签: r simulation coin-flipping


【解决方案1】:

你可以使用 diff() :

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

> x
 [1] 0 0 0 1 1 1 1 0 1 0

> sum(diff(x)!=0)
[1] 4

【讨论】:

    【解决方案2】:

    rle 函数将计算向量中相同值的“运行”次数。因此,该向量的长度(减 1)为您提供了更改的数量:

    > x
     [1] 0 0 0 1 1 1 1 0 1 0
    > rle(x)
    Run Length Encoding
      lengths: int [1:5] 3 4 1 1 1
      values : num [1:5] 0 1 0 1 0
    > length(rle(x)$lengths)-1
    [1] 4
    

    可能比 diff() 方法更快或更慢,但如果您需要它们,它也会为您提供运行长度...

    【讨论】:

    • 很有趣,因为你也有价值观。我实际上是在寻找这个功能,谢谢。
    • diff 方法要快得多,并且与交替次数无关。
    【解决方案3】:

    它绝对不会在优雅方面胜过 diff,而是在另一种方面:

    sum(x[-1] != head(x, n=-1))
    

    在我的系统上,这似乎要快一点:

    > x <- rbinom(1e6, 1, 0.5)
    > system.time(replicate(100, sum(x[-1] != head(x, n=-1))))
       user  system elapsed 
      8.421   3.688  12.150 
    > system.time(replicate(100, sum(diff(x) != 0)))
       user  system elapsed 
      9.431   4.525  14.248
    

    对于序列中不相等的相邻元素数量的分布,似乎应该有一个很好的解析解。

    【讨论】:

      【解决方案4】:

      伪代码(序列是你掷硬币的数组):

      variable count = 0
      variable state = sequence[0]
      iterate i from sequence[1] to sequence[n]
          if (state not equal sequence[i])
              state = 1 - state
              count++
      

      count 应该是你的结果

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-07
        • 1970-01-01
        相关资源
        最近更新 更多