【问题标题】:Solving simple dice roll and getting result in mean解决简单的掷骰子问题并得到平均值
【发布时间】:2020-01-22 14:00:44
【问题描述】:

我试图解决的是模拟掷骰子,它是这样的:

  • 数字是骰子 1,2,3,4,5,6 的默认值,它遵循 {0.15,0.15,0.2,0.2,0.2,0.1} 的概率分布
  • set.seed 为 555
  • 将有 100 卷
  • 结果应该是给定数字的平均值

这是我所做的:

set.seed(555)
sample(1:6, size = 100, prob = c(0.15,0.15,0.2,0.2,0.2,0.1), replace = TRUE)
#and previous one gives me result of 
[1] 5 2 1 4 1 3 6 5 3 2 2 5 4 4 6 1 4 3 1 6 5 3 5 5 3 4 3 6 5 3 4 5 1 5 5 5 3 5 1 5 2 4 1 1 3 3
[47] 2 3 3 3 4 3 1 3 4 5 4 5 6 2 4 3 5 3 1 2 4 4 5 1 4 3 5 1 1 2 5 1 3 5 6 6 6 2 2 2 5 4 3 1 1 5
[93] 1 6 5 2 6 5 3 1

现在的问题是我不明白你怎么能从这个数字中得到平均值或使用什么功能。我知道使用了 rnorm 和 mean,但我不明白如何使用。

【问题讨论】:

    标签: r


    【解决方案1】:

    预期值(即无限次投掷的平均值)将是:

    sum(1:6 * c(0.15,0.15,0.2,0.2,0.2,0.1))
    # [1] 3.45
    

    如果您想模拟 100 卷,您可以这样做:

    set.seed(555)
    sample1 <- sample(1:6, size = 100, prob = c(0.15,0.15,0.2,0.2,0.2,0.1), replace = TRUE)
    

    现在您可以检查样本并取其平均值:

    sample1
    #  [1] 5 2 1 4 1 3 6 5 3 2 2 5 4 4 6 1 4 3 1 6 5 3 5 5 3 4 3 6 5 3 4 5 1 5 5 5 3 5 1 5
    # [41] 2 4 1 1 3 3 2 3 3 3 4 3 1 3 4 5 4 5 6 2 4 3 5 3 1 2 4 4 5 1 4 3 5 1 1 2 5 1 3 5
    # [81] 6 6 6 2 2 2 5 4 3 1 1 5 1 6 5 2 6 5 3 1
    mean(sample1)
    # [1] 3.45
    

    如果你想变得非常花哨,你可以模拟你的 100 次掷骰子数千次并绘制结果,所有这些都只需要一行代码:

     hist(sapply(1:1000, function(x) mean(sample(1:6, size = 100, prob = c(0.15,0.15,0.2,0.2,0.2,0.1), replace = TRUE))), main = "Means of 100 throws (n = 1000)", xlab = "mean")
    

    【讨论】:

      【解决方案2】:

      这是您可以使用的代码,包括经验平均值和理论平均值

      set.seed(555)
      p <- c(0.15,0.15,0.2,0.2,0.2,0.1)
      res <- sample(1:6, size = 100, prob = p, replace = TRUE)
      # empirical mean
      mean_empirical <- mean(res)
      # theoretical mean
      mean_theoretical <- seq(6)%*%t(t(p))
      

      附加

      • 如果要查看 100 次掷骰的平均值分布,可以多次重复该事件(掷骰子 100 次的平均值),例如 100000 次,则可以尝试以下代码(使用 @987654326 @)
      r <- replicate(100000,mean(sample(1:6, size = 100, prob = p, replace = TRUE)))
      barplot(prop.table(table(r)))
      

      - 如果要查看res的经验分布,可以使用下面一行(使用prop.table()+table()

      barplot(prop.table(table(res)))
      

      【讨论】:

      • 不错!不过请告诉我,为什么 100000 次重复的经验分布与给定的概率相差如此之远?
      • @AllanCameron 第一个是“均值分布”,它遵循中心极限定理,所以看起来像一个高斯分布,而第二个只是“掷骰子一次的分布”
      • 谢谢。我得到了图表的内容(统计背景),但是在您的代码中 res 被 100000 次重复覆盖,所以我期望第二个图表与分布几乎完美匹配。现在我明白了 - 您正在绘制第一个 res 之前它被复制覆盖。感谢您的澄清。
      • @AllanCameron 是的。其实我的第一个和你的图一样,但是我用replicate来做,而你用sapply()
      • 我之前没用过replicate——肯定比sapply更整洁。 barplot 也比标准直方图更好。很高兴在 R 学习多年后学习新的基础知识!再次感谢
      猜你喜欢
      • 2014-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-07
      • 2021-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多