首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于仿真的事件概率估计

基于仿真的事件概率估计
EN

Stack Overflow用户
提问于 2014-10-17 07:21:12
回答 1查看 820关注 0票数 0

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

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

  1. 没人把帽子拿回来的可能性。
  2. 至少有一个赞助人能拿回自己的帽子的可能性。
  3. 平均有多少顾客能拿回自己的帽子。

对于模拟,让我们设置n=5

我在考虑分配

代码语言:javascript
运行
复制
hats <- c(1:5)
patrons <- c(1:5)

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

我有点搞不懂R是如何工作的,因为我以前使用Python,它们有一个不同的结构。但我的思维过程是这样的:

代码语言:javascript
运行
复制
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语言写了这样的话:

代码语言:javascript
运行
复制
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的功能是什么以及它是如何工作的?这是可行的,但并不真正像我们正在寻找的东西。

EN

Stack Overflow用户

发布于 2014-10-17 08:07:18

这里有一个非常简单的方法:

代码语言:javascript
运行
复制
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表示正确分配的hat,FALSE表示错误分配的hat。我们将这个逻辑向量赋值给myhat

然后我们对这个向量进行三次测试。

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

我们对此进行了大量的计算,得出的三个向量的平均值是对这三个情况的概率的估计。

我们现在可以把这些与分析计算出来的事实进行比较:

代码语言:javascript
运行
复制
# 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

作为参考,第二种情况(任何正确的hats )计算为1减去所有hats被错误分配的概率。所有hats被错误分配的概率是“疯狂”的次数除以可能排列的总数。第三种情况(正确的平均数)是正确分配每个帽子的期望之和(参见这里)。有一家相关员额 at math.stackexchange可能会引起人们的兴趣。

票数 3
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26419916

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档