使用甲板改组模拟在R中进行功能性思考

时间:2017-01-08 23:38:17

标签: r functional-programming

我正在查看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))为真。

所以,我的问题是:

  1. 实施比较的好方法(功能)是什么?

  2. 有没有更好的方法可以在功能上解决这个问题?

1 个答案:

答案 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