问题是:每个人都在门口检查他们的帽子,但由于某种原因,帽子检查服务员搞砸了记录,不记得哪个帽子属于谁。服务员决定随意将帽子归还给每个人。
我想在R中进行刺激估计:
对于模拟,请设置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
的功能是什么以及它是如何工作的?这有效,但并不像我们正在寻找的那样。
答案 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
= 1
,FALSE
= 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可能很有意思。