本帖最后由 星之子 于 2024-11-15 17:00 编辑
动机
这个帖子的动机是凌晨我和@娱乐法师火布偶 老师的一段友好讨论。
该讨论起源于我发了45帖却只生了2魂,自觉过于倒霉的小小吐槽;而火布偶老师则指出了低概率勋章容易出现触发少于预期的情况:
附:火布偶老师提到的帖子
勋章概率触发分布的说明(帖子来自@AncL 老师,大家可以去围观一下这个帖子,论述相当精彩)
代码
本着求真求知的探索精神,我用R编写了下面这段代码来计算我是否真的很倒霉:
- # 设置参数
- posts <- 45 # 发帖数
- n <- 9 # 设置生魂数量<=n
- p1 <- 0.02 # 2%魂勋章的概率
- p2 <- 0.01 # 1%魂勋章的概率
- n1 <- 8 # 2%魂勋章的数量
- n2 <- 4 # 1%魂勋章的数量
- dist1 <- function(k) dbinom(k, size = n1, prob = p1)
- dist2 <- function(k) dbinom(k, size = n2, prob = p2)
- total_dist <- function(m) {
- sum(sapply(0:n1, function(k1) dist1(k1) * dist2(m - k1) * (m - k1 >= 0)))
- }
- # 生魂小于等于n的累积概率
- calc_cumulative_prob <- function(n) {
- # PGF of 单次发帖生魂数
- pgf <- sapply(0:(n1 + n2), total_dist)
- # 卷积
- conv_pgf <- Reduce(function(x, y) convolve(x, rev(y), type = "o"), rep(list(pgf), posts))
- # 累加从0到n的概率
- cumulative_prob <- sum(conv_pgf[1:(n + 1)])
- return(cumulative_prob)
- }
- cumulative_prob_n <- calc_cumulative_prob(n)
- cat("发了", posts, "帖 总生魂数≤", n, "的累积概率为:", cumulative_prob_n)
复制代码
R语言虽然比较冷门,但解决概率论问题的时候还是蛮舒服的。而且本身相对轻量,用什么包就装什么包。
我个人是用部署在本地的R和R Studio,但在线工具也很好找,我这里的截图用的是点击直达。
使用方法:
按照代码注释修改发帖数、这些帖子的生魂数量、你所持有的2%和1%发帖+1灵魂勋章的数量,即可执行。然后可以看看这个情况出现的实际概率如何,如果概率很低则说明,你很倒霉。
代码执行的结果如下:
发了 45 帖 总生魂数≤ 9 的累积概率为: 0.5874126
发了 45 帖 总生魂数≤ 2 的累积概率为: 0.005921053
我又尝试复现AncL老师帖子里论述的结果,大致吻合:
①按照100次实验、总期望10%计算
令 p1 = 0.1, p2 = 0.05,分别测试 n1 = 1, n2 = 0 和 n1 = 0, n2 = 2 的情况,两次得出的结果如下:
发了 100 帖 总生魂数≤ 10 的累积概率为: 0.5831555
发了 100 帖 总生魂数≤ 10 的累积概率为: 0.5830672
②按照100次实验、总期望80%计算
令 p1 = 0.8, p2 = 0.4,分别测试 n1 = 1, n2 = 0 和 n1 = 0, n2 = 2 的情况,两次得出的结果如下:
发了 100 帖 总生魂数≤ 80 的累积概率为: 0.5398386
发了 100 帖 总生魂数≤ 80 的累积概率为: 0.5306622
综上所述:我持有8个2%和4个1%发帖+1灵魂勋章,在这种情况下发了45帖却只生了2魂的概率为0.5921053%,可以说是相当倒霉了,所以因此产生了吐槽。
来自群组: 星象占卜 |