明日方舟4周年出往期限定的概率

原理:

library(openxlsx)
# 設(shè)置隨機(jī)數(shù)種子,使結(jié)果具有可重復(fù)性
set.seed(42)
# 明日方舟四周年池中,抽出六星干員的概率總和為2%
total_six_star_rate <- 0.02
# 43個(gè)六星干員中,繆爾賽斯和霍爾海雅為當(dāng)期概率提升,這兩位干員共同占六星出率的70%(二者出率一樣)
up_rate <- 0.7
muelsis_rate <- total_six_star_rate * up_rate / 2
holhiya_rate <- muelsis_rate
# 剩余干員中,濁心斯卡蒂、歸溟幽靈鯊、耀騎士臨光為往期限定(此三者出率一樣),在剩余干員中,抽出概率分別為其余干員的五倍(其余干員出率一樣)
remaining_six_star_rate <- total_six_star_rate * (1 - up_rate)
limited_operator_num <- 3
remaining_operator_num <- 43 - 2 - limited_operator_num
# 計(jì)算剩余干員的總概率
remaining_operator_rate <- remaining_six_star_rate / (limited_operator_num * 5 + remaining_operator_num)
# 計(jì)算濁心斯卡蒂、歸溟幽靈鯊、耀騎士臨光的抽出概率
limited_operator_rate <- remaining_operator_rate * 5
# 定義模擬次數(shù)
n_simulations <- 1000000
# 設(shè)置循環(huán)抽卡次數(shù)
draw_nums <- seq(from = 10, to = 600, by = 10)
# 初始化保存結(jié)果的data.frame
results <- data.frame(Draws = draw_nums, Probability = rep(0, length(draw_nums)), Count = rep(0, length(draw_nums)))
# 進(jìn)行模擬
for (k in 1:length(draw_nums)) {
? successes <- 0
? total_skadi_draw_num <- 0
?
? cat("開始進(jìn)行 ", draw_nums[k], " 次抽卡的模擬...\n")
?
? for (i in 1:n_simulations) {
??? six_star_rate <- 0.02
??? consecutive_no_six_star <- 0
??? skadi_draw_num <- Inf
?? ?
??? for (j in 1:draw_nums[k]) {
????? draw_result <- runif(1)
???? ?
????? # 檢查是否抽到六星干員
????? if (draw_result <= six_star_rate) {
??????? consecutive_no_six_star <- 0
??????? six_star_rate <- 0.02
?????? ?
??????? # 檢查是否抽到濁心斯卡蒂
??????? if (runif(1) <= limited_operator_rate / total_six_star_rate) {
????????? skadi_draw_num <- j
????????? successes <- successes + 1
??????? }
????? } else {
??????? consecutive_no_six_star <- consecutive_no_six_star + 1
?????? ?
??????? # 更新保底機(jī)制
??????? if (consecutive_no_six_star >=50)
??????????? {
????????????? six_star_rate <- min(six_star_rate + 0.02, 1)
??????????? }
????? }
??? }
?? ?
??? #將每次模擬抽到的濁心斯卡蒂數(shù)量累加到總數(shù)中
??? total_skadi_draw_num <- total_skadi_draw_num + min(skadi_draw_num, draw_nums[k])
?? ?
??? #每模擬 10000 次,輸出一次當(dāng)前的模擬進(jìn)度
??? if (i %% 10000 == 0) {
????? cat("當(dāng)前正在模擬第 ", i, " 次...\n")
??? }
? }
?
? #計(jì)算概率和平均次數(shù)
? prob_skadi_in_draws <- successes / n_simulations
? avg_skadi_draw_num <- total_skadi_draw_num / successes
?
? #將結(jié)果保存到results中
? results[k, "Probability"] <- prob_skadi_in_draws
? results[k, "Count"] <- successes
?
? #輸出當(dāng)前模擬的結(jié)果
? cat("在 ", draw_nums[k], " 次抽卡內(nèi)抽到濁心斯卡蒂的概率為:", prob_skadi_in_draws * 100, "%,抽到 ", successes, " 個(gè),平均需要抽 ", round(avg_skadi_draw_num, digits = 2), " 次。\n")
}
#將結(jié)果保存到Excel文件中
write.xlsx(results, "prob_skadi.xlsx", sheetName = "Results", row.names = FALSE)
#輸出結(jié)果
cat("結(jié)果已保存到prob_skadi.xlsx文件中。")