在R中模拟骰子和掷硬币的结果

时间:2013-03-06 22:15:09

标签: r statistics probability

实验涉及滚动一个公平的模具并获得x说,然后投掷一个公平的硬币x次并记录尾巴的数量。我需要做50次这个实验并将结果记录在矢量中(我将用它来绘制直方图。)

到目前为止,这是我的代码:

    for (i in 1:100)
    {X <- sample(6,1,replace=TRUE,c(1,1,1,1,1,1)/6)
    Y <- sample(2,1,replace=TRUE,c(1,1)/2)}
    Youtcomes <- c(sum(Y))
    Youtcomes

但是我没有给我一个包含100个元素的向量,而是只获得一个数字。我哪里错了?

注意:我必须使用for循环。

4 个答案:

答案 0 :(得分:6)

使用R被矢量化的事实。然后,您可以使用二项分布来复制抛硬币。

heads <- rbinom(size = sample(6,100, replace = TRUE), n=100, prob = 0.5)
sum(heads)

答案 1 :(得分:6)

也许我错过了一些东西,但是一次打电话给sample()来做100个掷骰子,然后将其插入rbinom()以进行硬币投掷有什么问题?我们将sample()的输出传递给size参数

> set.seed(1)
> rbinom(100, size = sample(6, 100, replace = TRUE), prob = 0.5)
  [1] 1 1 1 6 1 2 2 2 3 1 2 1 2 1 1 0 3 1 1 3 6 1 2 0 2 1 1 1 2 2 2 1 0 1 4 3 3
 [38] 1 5 2 3 2 2 1 3 2 0 2 1 4 2 3 1 1 1 0 1 1 1 1 2 2 1 2 3 1 0 2 1 2 2 4 2 1
 [75] 1 5 3 2 3 5 1 2 3 1 4 0 3 1 2 1 1 0 1 5 2 3 0 2 2 3

答案 2 :(得分:4)

Discalimer :(非常低效的解决方案见mnel / Gavin的解决方案)

  

正如你可以在每个答案下面阅读许多,很多,......很多评论,而这个答案试图回答OP的具体问题(不管他的要求是多么低效),本着保持论坛的礼仪,一些人(正确地)指出问题是不好的味道,我的答案不符合论坛的要求。我接受所有的批评并在此留下答案只是出于明显的原因(标记为答案,连续性)。我建议你看看mnel / Gavin对这个特定问题的矢量化解决方案的答案。如果你对查看for循环的实现感兴趣,那么请参考这篇文章的底部,但我建议你看看它以了解for循环的结构,但是没有实现for循环到这个特定的问题。谢谢。


除了@Joshua已经提到的问题之外,你的代码还存在很多问题:

首先,每次在循环内部重写X和Y的值时,在循环结束时,只有Y的最后一个值被总结。

其次,Y的代码不正确。你说,你必须得到x次硬币投掷,然而,你使用sample(2, 1, ...)1必须替换为X,等于掷骰数。

请尝试使用此代码:

Youtcomes <- sapply(1:100, function(x) {
    X <- sample(1:6, 1, replace=TRUE, rep(1,6)/6)
    Y <- sample(c("H", "T"), X, replace=TRUE, rep(1,2)/2)
    sum(Y == "T")
})

在这里,我们循环100次,每次,样本值介于1和6之间并存储在X中。然后,我们采样head(H)或tail(T){{ 1}}次数并存储在Y中。

现在,X给出x的当前值的总和(1 <= x <= 100)。因此,最后,sum(Y == "T")将是您的模拟Youtcomes值集。

然后,您可以执行Y == Tail

编辑:如果它是一个所需的for循环解决方案,

hist(Youtcomes)

答案 3 :(得分:1)

阿伦打败了我。但是,许多方法中的另一种可能是(如果我正确理解你想要的结果......

X <- sample(6,100,replace=TRUE,c(1,1,1,1,1,1)/6)
Y <- lapply(X , function(x){ res <- sample( c( "H" , "T" ) , x , replace=TRUE , c(1,1)/2 ) ; table( res ) } )

您想对结果进行直方图编制....

res <- unlist(Y)
hist( res[names( res )=="T"] )