立即注册 登录
GameMale 返回首页

咸鱼鱼的个人空间 https://www.gamemale.com/?723150 [收藏] [复制] [RSS]

日志

R语言计算灵魂概率(基于星之子的代码修改)

热度 147已有 305 次阅读2024-12-27 13:19 |个人分类:R语言|系统分类:纯水(首页不显示)

运行地址
# 设置参数
posts <- 2     # 发帖数
n1 <- 2          # 设置生魂数量 = n1(计算总生魂数恰好为n1的概率)
n2 <- 0          # 设置生魂数量 ≤ n2(计算生魂数 ≤ n2的累积概率)

p1 <- 0.02       # 2%魂勋章的概率
p2 <- 0.01       # 1%魂勋章的概率

n1_max <- 12          # 2%魂勋章的数量
n2_max <- 7         # 1%魂勋章的数量

dist1 <- function(k) dbinom(k, size = n1_max, prob = p1)
dist2 <- function(k) dbinom(k, size = n2_max, prob = p2)
total_dist <- function(m) {
  sum(sapply(0:n1_max, function(k1) dist1(k1) * dist2(m - k1) * (m - k1 >= 0)))
}

# 计算总生魂数恰好为n1和生魂数≤n2的概率
calc_probabilities <- function(n1, n2) {
  # PGF of 单次发帖生魂数
  pgf <- sapply(0:(n1_max + n2_max), total_dist)
  
  # 卷积
  conv_pgf <- Reduce(function(x, y) convolve(x, rev(y), type = "o"), rep(list(pgf), posts))
  
  # 获取恰好为n1的概率
  exact_prob_n1 <- conv_pgf[n1 + 1]  # 因为R的索引从1开始,因此位置是n1+1
  
  # 获取生魂数≤n2的累积概率
  cumulative_prob_n2 <- sum(conv_pgf[1:(n2 + 1)])  # 累积概率从0到n2

  return(list(exact_prob_n1 = exact_prob_n1, cumulative_prob_n2 = cumulative_prob_n2))
}

probabilities <- calc_probabilities(n1, n2)

cat("发了", posts, "帖 总生魂数=", n1, "的概率为:", probabilities$exact_prob_n1, "\n")
cat("发了", posts, "帖 总生魂数≤", n2, "的累积概率为:", probabilities$cumulative_prob_n2, "\n")

130

震惊
3

感谢
4

关心
7

加油
3

有爱

刚表态过的朋友 (147 人)

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 立即注册

关闭

站长公告上一条 /1 下一条

文字版|手机版|小黑屋|GameMale

GMT+8, 2025-12-23 14:49 , Processed in 0.038937 second(s), 13 queries , Redis On.

Copyright © 2013-2025 GameMale

All Rights Reserved.