通过模拟估计事件的概率

时间:2014-10-17 07:21:13

标签: r simulation probability

问题是:每个人都在门口检查他们的帽子,但由于某种原因,帽子检查服务员搞砸了记录,不记得哪个帽子属于谁。服务员决定随意将帽子归还给每个人。

我想在R中进行刺激估计:

  1. 没有人正确收回帽子的概率。
  2. 至少有一位赞助人得到自己的帽子的可能性。
  3. 获得自己帽子的顾客的平均数量。
  4. 对于模拟,请设置n=5

    我在考虑分配

    hats <- c(1:5)
    patrons <- c(1:5)
    

    并创建一个函数(a,b){a-b}

    我对R的工作方式感到有点困惑,因为我曾经使用过Python而且它们有不同的结构。但我的思考过程是这样的:

    patrons = float(input("How many people attend? "))
    def number_of_patrons_assign:
       for i in patrons:
           return i
    def number_of_hats_assign:
       for r in hats:
           return r
    def counting:
       list=[]
       if number_of_patrons_assign == number_of_hats_assign
          return list
    

    对不起,这可能是罗嗦的,但我还没有使用Python一年。

    我的合作伙伴使用R语言写了这个:

    hats <- c(1:5)
    patrons <- c(1:5)
    vector <- NULL
    test <- function(a, b)
    {
      a-b
    }
    p <- 0
    for(n in 1:10)
    {
      x <- sample(hats, 5, replace = FALSE)
      y <- sample(patrons, 5, replace = FALSE)
      test(x, y)
      vector[n] <- c(if(test(x, y)==0) p <- 0,
      ifelse(test(x, y)==9, p <- 0, P <- 1))
    }
    

    我不知道NULL的功能是什么以及它是如何工作的?这有效,但并不像我们正在寻找的那样。

1 个答案:

答案 0 :(得分:3)

这是一个非常简单的方法:

set.seed(1)
n <- 5
rowMeans(replicate(100000, {
  myhat <- sample(n) == seq_len(n)  
  c(all.correct=all(myhat), any.correct=any(myhat), n.correct=sum(myhat))
}))

# all.correct any.correct   n.correct 
#     0.00838     0.63163     0.99769 

首先,sample(n)随机置换数字1:n,然后我们将每个元素与向量1:n中的对应元素进行比较。这将返回长度为n的逻辑向量,我们可以想象TRUE代表正确分配的帽子,FALSE反映了错误分配的帽子。我们将此逻辑向量分配给myhat

然后我们对这个载体进行三次测试。

首先,所有帽子都正确分配了吗?如果是,则myhat的所有元素都将为TRUE,因此all(myhat)也将为TRUE。第二,是否正确分配了任何的帽子?如果是这样,myhat的至少一个元素将为TRUE,因此any(myhat)将为TRUE。最后,正确分配了多少个帽子?在R中,逻辑向量被视为数字(TRUE = 1FALSE = 0),如果有必要,因此sum(myhat)返回正确分配的帽子数量

我们replicate这么多次,三个向量中每个向量的结果均为三个案例概率的估计值。

我们现在可以将这些与实际情况进行比较,分析计算:

# All correct:
1/factorial(n)
# [1] 0.008333333

# Any correct
1 - round(factorial(n)/exp(1))/factorial(n)
# [1] 0.6333333

# Average number correct
1/n * n
# [1] 1

作为参考,第二种情况(任何帽子正确)计算为1减去所有帽子被错误分配的概率。所有帽子被错误分配的概率是number of "derangements"除以可能的排列总数。第三种情况(平均数正确)是正确分配每个帽子的期望值的总和(见here)。 math.stackexchange上有一个related post可能很有意思。