用于模拟从袋子中挑选瓷砖的设置的 R 代码
R code for simulation of a of setup for picking tiles from a bag
问题是盒子里有 5 个图块,编号为 1、2、3、4、5。我挑选了 2 块牌,记下数字并将牌放入包中。然后我再次挑选 2 个瓷砖并记下数字。数字之间没有重叠的概率是多少?假设第一次得到 1,4,然后第二次得到 3,5。没有重叠。理论结果为3/10
。但是这个模拟一直给我一个接近 0.5 的答案。关于我做错了什么的任何见解?它可能是 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
我已经有一段时间没有使用 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。
我不会使用循环。 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
问题是盒子里有 5 个图块,编号为 1、2、3、4、5。我挑选了 2 块牌,记下数字并将牌放入包中。然后我再次挑选 2 个瓷砖并记下数字。数字之间没有重叠的概率是多少?假设第一次得到 1,4,然后第二次得到 3,5。没有重叠。理论结果为3/10
。但是这个模拟一直给我一个接近 0.5 的答案。关于我做错了什么的任何见解?它可能是 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
我已经有一段时间没有使用 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。
我不会使用循环。 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