问题是:每个人都在门口检查他们的帽子,但是由于某种原因,帽子检查员把记录搞砸了,不记得哪顶帽子是谁的了。服务员决定随便把帽子还给每个人。
我想在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
的功能是什么以及它是如何工作的?这是可行的,但并不真正像我们正在寻找的东西。
发布于 2014-10-17 08:07:18
这里有一个非常简单的方法:
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
= 1
,FALSE
= 0
),因此sum(myhat)
返回正确分配的hats数量。
我们对此进行了大量的计算,得出的三个向量的平均值是对这三个情况的概率的估计。
我们现在可以把这些与分析计算出来的事实进行比较:
# 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可能会引起人们的兴趣。
https://stackoverflow.com/questions/26419916
复制相似问题