R语言计算本次活动存活概率
本帖最后由 咸鱼鱼 于 2025-3-5 23:32 编辑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) {
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) {
loss[ , day] <- ifelse(loss[ , day] == 0, 15, loss[ , day])# 让原本 0 的改为 15
}
}
# 处理特殊情况
for (day in 1:days) {
if (special_event_probs < 1/7) {
loss[, day] <- loss[, day] + 10# 每个人额外损失 10 块钱
} else if (special_event_probs < 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))
我觉得你们还是祈祷一下我不要天天随机到【热血竞技场】和【荆棘迷宫】吧;P 你这样不是没有计算场地条件吗,是不是不太准确{:6_176:} 希望自己能够少点掉血吧,我想活下去惹{:6_169:} 看来没有想象的那么凶残。玩得开心就好,中途淘汰了也有参与奖倒不是一无所获 阿门(´×ω×`)确实要许愿活动员手气也好点的,现在存活率一半都没有……要遭(´×ω×`) 鱼鱼老师分析一下场地因素概率加权后的存活概率又可以水一帖了:$:$ 随机性太高了惹 这让我们非酋怎么活:'( 祈祷天天都抽到温泉,救救非酋吧{:6_164:} 惹 這個本浣看不懂惹 把他丟進去就好!!! 代码计算这种概率问题真的好方便欸{:6_197:}
规则2其实还要更改一下,毕竟有两个回血的场地在呢。 看来这次优胜的难度也特别大 大佬这么厉害吗,代码看不太懂,但是看结果来说好像有点难活下来惹 和上次电锯人大逃杀活动相比,感觉这次活动的策略空间很小,纯看运气。 计算存活率好高但是场地随机变数太大但凡额外掉血最后感觉没多少能存活{:4_96:} 感觉过了几天以后会算起来更容易一些吧 希望这次能活到大结局啊!阿不思给予我力量 不愧是泥潭鱼大师都帮大伙计算好了存活率...
看起来活动还是有相当难度...希望火老师手下留情~非酋只想存活拿好拿满勋章啊 {:6_164:} 一半以上的存活率也可以接受惹
我觉得你们还是祈祷一下我不要天天随机到【热血竞技场】和【荆棘迷宫】吧
火老师的回帖给我让我心凉凉的TVT,希望我不要是那0.2,555