2017-01-08 48 views
1

我在看this problem(複製下面),並希望在功能上模擬它(特別是在R)一些幫助。功能上在R與甲板洗牌模擬

在下雪的下午,您喜歡玩52個卡片的標準隨機洗牌單人紙牌遊戲。你開始把牌面朝上,一次一張地堆成一堆。當你處理每張牌時,你還可以大聲說出13張牌在標準牌組中的位置:王牌,兩枚,三枚等等(當你到達國王時,你從王牌開始)。你所交易的牌的等級與你所說的等級相匹配,在這種情況下你輸了。如果你在沒有任何比賽的情況下到達甲板的末端,你就會獲勝。

你贏的概率是多少?

通過一個for循環這樣做似乎很簡單 - 每個循環中,通過rep(seq(13),4)建甲板,置換,然後檢查是否有任何的置換和unpermuted甲板之間的條目是相等的。我特別感興趣的是這個功能方法。爲此,我想構建x <- rep(seq(13),4)一次,製作一個52 by 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. 有沒有更好的方法來解決這個問題的功能?

回答

2

習語R代碼裏面功能的,因爲它涉及到無副作用的功能意義(常常匿名),量化代碼,並在apply家族重使用功能(這是R-版本map,功能性編程中的統一主題之一)。你可以做的模擬像這樣:

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