【问题标题】:Thinking functionally in R with deck shuffling simulation在 R 中使用套牌洗牌模拟进行功能性思考
【发布时间】:2017-01-08 23:38:17
【问题描述】:

我正在查看 this problem(复制如下),并希望在功能上模拟它(特别是在 R 中)方面得到一些帮助。

在下雪的下午,您喜欢玩一副标准的、随机洗牌的 52 张纸牌的单人纸牌“游戏”。你开始将牌面朝上发牌,一次一张,成一堆。当您发每张牌时,您还按顺序大声说出标准套牌中的 13 张牌面:A、2、3 等。(当您到达 K 时,您从 A 重新开始。)您一直这样做直到你发的牌的等级与你大声说话的等级相匹配,在这种情况下你输了。如果您在没有任何比赛的情况下到达牌组的尽头,您就赢了。

你获胜的概率是多少?

通过 for 循环执行此操作似乎很简单 - 在每个循环中,通过 rep(seq(13),4) 构建卡组,对其进行置换,然后检查置换和未置换卡组之间的任何条目是否相等。我对这种功能性方法特别感兴趣。为此,我想构建一次x <- rep(seq(13),4),制作一个 52 x n 矩阵,其中每列是sample(x),然后找到某种方法来检查每一列是否为sample(x) ~ x,其中〜我的意思是“至少有一个共享元素,这意味着索引和值相等”。这将有望返回真/假,具体取决于这是真还是假。

因此,对于~,如果我将其称为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. 有没有更好的方法来解决这个问题?

【问题讨论】:

    标签: r functional-programming


    【解决方案1】:

    惯用的 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

    【讨论】:

      猜你喜欢
      • 2021-02-11
      • 2013-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-25
      • 1970-01-01
      • 2017-11-06
      • 2012-09-01
      相关资源
      最近更新 更多