我正在查看this problem(复制如下),并希望获得一些功能上的模拟帮助(特别是在R中)。
在白雪皑皑的下午,你喜欢用标准的随机洗牌的52张纸牌玩“单人游戏”游戏。你开始将卡面朝上,一次一张,成堆。当你处理每张卡片时,你也会大声说出13张卡片面对标准牌组:ace,2,3等等(当你到达国王时,你会从ace开始。)你一直这样做直到你交易的卡的等级与你大声说出的等级相匹配,在这种情况下你输了。如果你在没有任何比赛的情况下到达牌组的末尾,你就赢了。
你获胜的几率是多少?
通过for循环执行此操作似乎很简单 - 在每个循环中,通过rep(seq(13),4)
构建卡组,置换它,然后检查置换和未置换卡组之间的任何条目是否相等。我对这个功能方法特别感兴趣。为此,我考虑构建x <- rep(seq(13),4)
一次,在 n 矩阵中创建52,其中每列为sample(x)
,然后找到一些方法来检查每列是否为sample(x) ~ x
,其中〜我的意思是“至少有一个共享元素,意味着索引和值相等”。这将有希望返回true / false,具体取决于它是真还是假。
因此,对于~
,如果我将其称为compare(x,y)
,我希望compare(c(1,2,3),c(3,1,2))
为假,compare(c(1,2,3,4,5),c(8,9,10,11,5))
为真。
所以,我的问题是:
实施比较的好方法(功能)是什么?
有没有更好的方法可以在功能上解决这个问题?
答案 0 :(得分:2)
惯用R代码是功能,因为它涉及无副作用的函数(通常是匿名的),矢量化代码以及apply
系列中大量使用函数(这是map
的R版本,是函数式编程中的统一主题之一。你可以做这样的模拟:
x = rep(1:13,4)
deranged <- function(x,y){all(x!=y)}
samples <- replicate(10000,sample(x,52))
wins <- apply(samples,2,function(y){deranged(x,y)})
p <- sum(wins)/10000
在我上次投放时,p
评估为0.017