-1

该实验涉及掷一个公平的骰子并让 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

4 回答 4

6

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

heads <- rbinom(size = sample(6,100, replace = TRUE), n=100, prob = 0.5)
sum(heads)
于 2013-03-06T22:38:46.913 回答
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
于 2013-03-06T22:40:24.770 回答
4

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.
}
于 2013-03-06T22:27:24.100 回答
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"] )
于 2013-03-06T22:32:06.640 回答