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



该实验涉及掷出一个公平的骰子并获得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 循环。

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

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

也许我错过了一些东西,但是一个电话给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

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

正如您可以阅读的许多,许多,..每个答案下面都有很多评论,虽然这个答案试图回答OP的具体问题(无论他的要求多么低效(,本着保持论坛礼仪的精神,有些人(正确地(指出这个问题很糟糕,我的回答不符合论坛的要求。我接受所有批评,并仅出于显而易见的原因(标记为答案,连续性(将答案留在这里。我建议你看看mnel/Gavin的答案,以获得这个特定问题的矢量化解决方案。如果你有兴趣查看for-loop的实现,那么请参考这篇文章的底部,但我建议你看看它以了解for-loop的结构,但不要实现这个特定问题的for-loop。谢谢。


你的代码充满了很多问题,除了已经提到的主要问题@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(进行采样X次数并存储在Y中。

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

然后,您可以执行hist(Youtcomes)

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

# always assign the variable you'll index inside for-loop
# else the object will keep growing every time and a copy of 
# entire object is made for every i, which makes it extremely 
# slow/inefficient.
Youtcomes <- rep(0, 100)
for (i in 1:100) {
    X <- sample(1:6, 1, replace=TRUE, rep(1,6)/6)
    Y <- sample(c("H", "T"), X, replace=TRUE, rep(1,2)/2)
    # assign output inside the loop with [i] indexing
    Youtcomes[i] <- sum(Y == "T")
    # since Youtcomes is assigned a 100 values of 0's before
    # the values will replace 0' at each i. Thus the object 
    # is not copied every time. This is faster/efficient.
}

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

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"] )

最新更新