2015-11-07 35 views
1

問題是有5個瓷磚編號爲1,2,3,4,5的框。我選擇2塊瓷磚記下數字並將瓷磚放入包中。然後我再次選擇2個瓷磚並記下數字。數字之間沒有重疊的概率是多少?說第一次得到1,4,然後第二次得到3,5。沒有重疊。理論結果是3/10。但是這個模擬一直給我一個接近0.5的答案。關於我在做什麼的任何見解都是錯誤的?它可能是R中的示例函數嗎?用於仿真從包中拾取瓷磚的設置的R代碼

我製作了一個矩陣,你可以用5個瓷磚1,2 1,3等獲得所有可能的配對,然後生成兩個給出行號的隨機數。我認爲這些是數字的兩個畫面,看看它們是否相等。

set.seed(1234) 
    n=10000 
    count=0 
    t<-cbind(c(1,1,1,1,2,2,2,3,3,4),c(2,3,4,5,3,4,5,4,5,5)) 
    idx<-sample(1:10,2*n,replace=T) 
    i<-idx[1:n] 
    j<-idx[(n+1):(2*n)] 
    for(ii in 1:n) { 
    if((t[i[ii],1] != t[j[ii],1]) && (t[i[ii],2] != t[j[ii],2])) 
    count=count+1 
    } 
    count/n 
[1] 0.5004 

任何見解都會有所幫助。我相信理論上的答案是3/10

+0

我不明白在這裏使用'&&'。我認爲你應該使用'length(intersect(t [i,],t [j,]))> 0'作爲你的條件。 – Frank

回答

1

我不會使用循環。 10000個觀察值不夠大,不足以阻止您在樣本中構建data.frame。在下面的代碼中,我取兩次samples並將它放在10000行×4列對象中。然後我確定哪些行有duplicated選擇。然後我除以你的總數。 1-在那裏,因爲代碼計數爲duplicateds。我的結果符合理論數字。

n <-10000 
res <-cbind(t(replicate(n,sample(1:5,2,replace=FALSE))),t(replicate(n,sample(1:5,2,replace=FALSE)))) 
1-sum(apply(apply(res, 1, duplicated),2,any))/n 
#[1] 0.2979 
2

這已經有一段時間了,因爲如果我有點生鏽,我已經使用R了,所以我很抱歉。對我來說你幾乎就在那裏。問題出在for循環中的if語句中。您正在測試第一對中的第一個號碼是否與第二對中的第一個號碼不同,並且第一對中的第二個號碼與第二對中的第二個號碼不同。但是你忘記了第一對中的第一個號碼與第二對號碼中的第二個號碼不同,而第一對中的第二個號碼與第二對中的第一個號碼不同。以下是全系列:

if( 
    (t[i[ii],1] != t[j[ii],1]) && 
    (t[i[ii],2] != t[j[ii],2]) && 
    (t[i[ii],1] != t[j[ii],2]) && 
    (t[i[ii],2] != t[j[ii],1]) 
) count=count+1 

可能還有其他方法可以完成此操作,但這似乎有訣竅。結果我得到約0.3。並感謝有機會再次考慮R。

+0

我想我的評論權限現在非常小。只是想說這是來自P Lapointe的一個非常好的答案。 apply函數是一個值得學習和使用的函數。我在答覆中強調了堅持OP的過程,以顯示它走向何方。但是如果有人要用R做很多模擬,他們會理解P Lapointe的代碼。 – emd