使用replicate()滚动100个骰子10,000次;意外结果

时间:2017-09-05 19:06:50

标签: r

在EdX R stats类中,我们被要求查看在一组100个掷骰子中滚动'6'的次数。然后我们被要求滚动100个骰子10,000次,以查看平均值与100骰子卷的标准差。

100模辊的结果如预期的那样;约0.1703左右(1/6 = 0.1666667)

但是当我加载replicate()来抛出100个骰子的10,000次以查看10,000个手段时,结果并不是我所期望的。我没有看到z-score = 2的范围之外的任何值:

set.seed(1)
# get mean of 100 dice rolls
mean100dice <- function(){
   n=100
   x <- replicate(n, sample(1:6, n, replace=TRUE), simplify='vector')
   mean(x==6)
}
mean100dice() #these come out as expected

means10k <- replicate(10000, mean100dice(),simplify='vector')
p = 1/6
z = (means10k - p) / sqrt(p*(1-p)/n)
mean(z > 2)       ## I expect this to be > 0
range(means10k)   ## sanity check

> mean(z > 2)
[1] 0
> range(means10k)
[1] 0.1522 0.1806

2 个答案:

答案 0 :(得分:1)

猜测,您在计算n <- 100时设置了n <- 10000而不是z

提供明确的变量名称是一个好主意,所以你不要混淆。例如,您需要区分n_dice_rollsn_replicates

顺便提一下,你计算100个骰子的平均值的代码是不正确的。

sample(1:6, n, replace=TRUE)掷骰子n;您也不需要致电replicate()。我想你想要这样的东西。

roll_nd6 <- function(n_dice) {
  sample(1:6, n_dice, replace = TRUE)
}
get_fraction_of_sixes_from_rolling_nd6 <- function(n_dice) {
  mean(roll_nd6(n_dice) == 6L)
}
monte_carlo_simulate_get_fraction_of_sixes <- function(n_replications, n_dice) {
  replicate(
    n_replications, 
    get_fraction_of_sixes_from_rolling_nd6(n_dice),
    simplify = "vector"
  )
}
calc_z_score <- function(actual_p, expected_p) {
  (actual_p - expected_p) / 
    sqrt(expected_p * (1 - expected_p) / length(actual_p))
}
actual_fraction_of_sixes <- monte_carlo_simulate_get_fraction_of_sixes(10000, 100)
z_scores <- calc_z_score(actual_fraction_of_sixes, 1 / 6)

答案 1 :(得分:0)

你在mean100dice中犯了一个错误:你抽100个骰子,并复制100次,所以它实际上不是100个骰子的平均值,而是100 * 100 = 10,000个骰子。当然,平均值的平均值将更接近p。