469MAPabu: 用代码算了下,假设场地都是没效果的那个,1000个玩家,模拟10000次游戏,最终存活的概率在0.56左右,比心理预期高了不少
有坛友说存活率比想象中高很多,我也去尝试了一下
简单来说原理就是,100点血,a概率不掉血,b概率掉15血,c概率掉25血,持续7天,最终血量大于0的概率人数
https://rtool.cn/run/r400.html
把下面的代码粘贴到上面的链接进行计算,发现不掉血的概率如果33%确实是0.56左右
但实际上,至少应该是每天34%的人不掉血,这样存活概率又提高到了0.58左右
如果再乐观一点,假设每天50%的人不掉血,这样存活概率可以提高到0.8左右
可以说容错还是很高的
不过活动规则又说如果超过80%的人不掉血,他们就会掉15血,那应该如何计算呢
我让AI写了新的代码并计算了一下,结果显示存活概率还是0.8左右
大家也可以自己尝试一下,总之这个活动看起来吓人,不过其实也没有那么吓人,大家不要太过担心就好
新增了规则2
1/7概率,所有人额外掉10血
1/7概率,原来掉15血的人变成掉25血,掉25血的人变成掉40血
存活率一下子从0.56狂跌至0.33
- set.seed(123) # 设置随机种子,保证可复现
- simulate <- function(trials, days, a, b, c) {
- initial_money <- 100
- success_count <- 0
-
- for (i in 1:trials) {
- money <- initial_money
-
- for (j in 1:days) {
- p <- runif(1) # 生成0到1之间的随机数
-
- if (p < a) {
- # 不损失
- } else if (p < a + b) {
- money <- money - 15
- } else {
- money <- money - 25
- }
- }
-
- if (money > 0) {
- success_count <- success_count + 1
- }
- }
-
- return(success_count / trials)
- }
- # 设定概率值
- a <- 0.34 # 34% 不损失
- b <- 0.33 # 33% 损失15血
- c <- 0.33 # 33% 损失25血
- # 运行模拟
- probability <- simulate(trials = 100000, days = 7, a = a, b = b, c = c)
- print(paste("7天后血大于0的概率:", probability))
复制代码
新增规则:如果超过80%的人不掉血,他们就会掉15血
- set.seed(123)
- simulate_vectorized <- function(trials, days, a, b, c) {
- initial_money <- 100
-
- # 生成所有 trials * days 个随机数
- random_probs <- matrix(runif(trials * days), nrow = trials, ncol = days)
-
- # 计算每天的损失(初步计算,不考虑80%规则)
- loss <- ifelse(random_probs < a, 0,
- ifelse(random_probs < a + b, 15, 25))
-
- # 统计每天不损失的人数
- no_loss_count <- rowSums(loss == 0) # 每天不损失的玩家数
-
- # 找出超过80%不损失的情况
- threshold <- trials * 0.8
- exceed_80 <- no_loss_count > threshold # 标记哪些天超过80%的人没损失
-
- # 让这些天所有原本不损失的钱的人都损失15
- for (day in 1:days) {
- if (exceed_80[day]) {
- loss[ , day] <- ifelse(loss[ , day] == 0, 15, loss[ , day]) # 让原本 0 的改为 15
- }
- }
-
- # 计算 7 天后的总血
- final_money <- initial_money - rowSums(loss)
-
- # 计算最终血大于 0的概率
- return(mean(final_money > 0))
- }
- # 设定概率值
- a <- 0.5 # 50% 不损失
- b <- 0.3 # 30% 损失15血
- c <- 0.2 # 20% 损失25血
- # 运行模拟
- probability <- simulate_vectorized(trials = 1000, days = 7, a = a, b = b, c = c)
- print(paste("7天后血大于0的概率:", probability))
复制代码
新增规则2
1/7概率,所有人额外掉10血
1/7概率,原来掉15血的人变成掉25血,掉25血的人变成掉40血
- set.seed(123)
- simulate_vectorized <- function(trials, days, a, b, c) {
- initial_money <- 100
-
- # 生成所有 trials * days 个随机数
- random_probs <- matrix(runif(trials * days), nrow = trials, ncol = days)
- special_event_probs <- runif(days) # 生成特殊事件的概率
-
- # 计算每天的损失(初步计算,不考虑特殊规则)
- loss <- ifelse(random_probs < a, 0,
- ifelse(random_probs < a + b, 15, 25))
-
- # 统计每天不损失的人数
- no_loss_count <- rowSums(loss == 0) # 每天不损失的玩家数
-
- # 找出超过80%不损失的情况
- threshold <- trials * 0.8
- exceed_80 <- no_loss_count > threshold # 标记哪些天超过80%的人没损失
-
- # 让这些天所有原本不损失的钱的人都损失15
- for (day in 1:days) {
- if (exceed_80[day]) {
- loss[ , day] <- ifelse(loss[ , day] == 0, 15, loss[ , day]) # 让原本 0 的改为 15
- }
- }
-
- # 处理特殊情况
- for (day in 1:days) {
- if (special_event_probs[day] < 1/7) {
- loss[, day] <- loss[, day] + 10 # 每个人额外损失 10 块钱
- } else if (special_event_probs[day] < 2/7) {
- loss[, day] <- ifelse(loss[, day] == 15, 20,
- ifelse(loss[, day] == 25, 40, loss[, day]))
- }
- }
-
- # 计算 7 天后的总金额
- final_money <- initial_money - rowSums(loss)
-
- # 计算最终钱大于 0 的概率
- return(mean(final_money > 0))
- }
- # 设定概率值
- a <- 0.34 # 50% 不损失
- b <- 0.3 # 30% 损失15块
- c <- 0.3 # 20% 损失25块
- # 运行模拟
- probability <- simulate_vectorized(trials = 5000, days = 7, a = a, b = b, c = c)
- print(paste("7天后钱大于0的概率:", probability))
复制代码
|