如何在R语言中模拟指定概率的加载骰子?含验证绘图需求
模拟加载骰子的R实现
嘿,我来帮你搞定这个加载骰子的模拟!其实你已经离答案很近了——sample()函数本身就支持自定义概率,只需要用到它的prob参数就行,完全不用复杂的逻辑。
步骤1:定义概率向量
你已经算出了正确的p=6/37,先把每个骰子面对应的理论概率明确下来(直接代入p值计算):
# 先定义已知的p值 p <- 6/37 # 生成各面的概率向量:顺序对应骰子1-6面 prob_vec <- c(2*p/3, p, p, p, p, 3*p/2) # 可选但推荐:验证概率和是否为1(确保计算没错) sum(prob_vec) # 运行后应该返回1,说明概率分布合法
这里算出来的prob_vec实际是c(4/37, 6/37, 6/37, 6/37, 6/37, 9/37),总和刚好是1,完全符合概率分布要求。
步骤2:模拟加载骰子投掷
和公平骰子的代码几乎一样,只需要多指定prob参数为我们刚才生成的概率向量。比如模拟10000次投掷(次数越多,结果越接近理论值):
# 设置随机种子,让结果可复现(可选但方便调试) set.seed(123) # 模拟10000次加载骰子投掷 num_rolls <- 10000 loaded_rolls <- sample(1:6, size = num_rolls, replace = TRUE, prob = prob_vec)
如果只需要单次投掷,直接把size改成1就行:sample(1:6, size=1, replace=TRUE, prob=prob_vec)。
步骤3:验证模拟正确性(统计+绘图)
为了确认模拟结果符合预期,我们可以对比模拟频率和理论概率,用图表直观展示:
方法1:基础绘图(无需额外包)
# 计算每个面的模拟出现频率 sim_freq <- table(loaded_rolls)/num_rolls # 准备对比数据框 comparison_data <- data.frame( 骰子面 = 1:6, 理论概率 = prob_vec, 模拟频率 = as.numeric(sim_freq) ) # 绘制并排柱状对比图 barplot(t(comparison_data[,2:3]), beside = TRUE, names.arg = comparison_data$骰子面, col = c("steelblue", "coral"), main = "加载骰子:理论概率 vs 模拟频率", xlab = "骰子面", ylab = "概率/频率", legend.text = c("理论概率", "模拟频率"), args.legend = list(x = "topright"))
运行后会生成一张对比图,你能看到模拟频率和理论概率非常接近,说明模拟是正确的。
方法2:用ggplot2绘制更美观的图
如果你习惯用ggplot2,可以这样写(需要先安装包:install.packages("ggplot2")):
library(ggplot2) library(tidyr) # 用于转换数据格式 # 将宽格式数据转为长格式,方便ggplot绘图 comparison_long <- pivot_longer(comparison_data, cols = -骰子面, names_to = "类型", values_to = "数值") # 绘制对比图 ggplot(comparison_long, aes(x = factor(骰子面), y = 数值, fill = 类型)) + geom_col(position = "dodge", width = 0.7) + labs(title = "加载骰子:理论概率 vs 模拟频率", x = "骰子面", y = "概率/频率") + theme_minimal() + scale_fill_brewer(palette = "Set2")
这个图样式更整洁,也更容易调整细节。
小提示
- 模拟的次数越多(比如10万次),模拟频率就会越贴近理论概率,这是大数定律的体现。
- 如果你需要重复多次模拟,直接把上述代码封装成函数即可,复用起来更方便。
内容的提问来源于stack exchange,提问作者Jared Joselowitz
相关产品推荐
相关产品推荐

