用于模拟从包中挑选瓷砖的设置的R代码

时间:2015-11-07 00:02:46

标签: r simulation probability

问题是有5个瓷砖编号为1,2,3,4,5的盒子。我挑选2个瓷砖,记下数字并将瓷砖放入包中。然后我再次选择2个瓷砖并记下数字。数字之间没有重叠的概率是多少?说第一次获得1,4,然后第二次获得3,5。没有重叠。理论结果是3/10。但是这个模拟一直给我一个接近0.5的答案。关于我做错了什么的见解?它可能是R中的样本函数吗?

我制作了一个矩阵,其中包含5个tile 1,2,3,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

2 个答案:

答案 0 :(得分:2)

我已经有一段时间了,因为如果我有点生疏,我就这么道歉了。在我看来你几乎就在那里。问题出在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。

答案 1 :(得分: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