在R中实现符合特定规则的准随机事件序列生成函数
完善生成随时间变化随机事件的R函数
以下是满足所有规则的完整实现代码,针对你未完成的概率更新、新事件引入等核心逻辑做了补全:
#install.packages("randtoolbox") library(randtoolbox) quasi_random_events <- function(n_events = 10, rateIncrease = 2, rateDecrease = 0.3, newEventProb = 0.5, iter = 5, newEventChance = 0.2) { # 1) 初始包含N个事件 events <- LETTERS[1:n_events] # 2) 初始事件概率大致相等,总和为1 n <- length(events) x <- sobol(n = n) probs <- x / sum(x) # 跟踪每个事件的选中次数 counts <- rep(0, n) res <- list() for (i in 1:iter) { # 记录当前迭代的状态 current_state <- list(events = events, probabilities = round(probs, 4), counts = counts) res[[i]] <- current_state # 3) 随机选中一个事件,将其概率提升至当前最高概率的指定倍数 current_max_prob <- max(probs) selected_idx <- sample(1:length(events), 1) new_selected_prob <- current_max_prob * rateIncrease remaining_prob <- 1 - new_selected_prob # 分配剩余概率给其他事件 if (length(probs) > 1) { other_probs <- probs[-selected_idx] probs[-selected_idx] <- other_probs / sum(other_probs) * remaining_prob } probs[selected_idx] <- new_selected_prob # 更新选中事件的计数 counts[selected_idx] <- counts[selected_idx] + 1 # 4) 出现次数最多的事件概率以更高速率下降 max_count <- max(counts) max_count_idx <- which(counts == max_count) # 高频事件概率下降更快,其他事件按比例下降 probs[max_count_idx] <- probs[max_count_idx] * (1 - rateDecrease) probs[-max_count_idx] <- probs[-max_count_idx] * (1 - rateDecrease/2) # 重新归一化确保总和为1 probs <- probs / sum(probs) # 5) 随机引入新事件,概率远高于其他事件 if (runif(1) < newEventChance) { # 生成新事件名称 new_event <- if (length(events) < 26) { LETTERS[length(events) + 1] } else { paste0("Event_", length(events) + 1) } # 调整原有事件概率,为新事件留出空间 probs <- probs * (1 - newEventProb) / sum(probs) # 添加新事件相关数据 events <- c(events, new_event) probs <- c(probs, newEventProb) counts <- c(counts, 0) } } return(res) }
核心逻辑说明
初始状态
- 用
LETTERS生成初始事件名,通过Sobol序列生成近似均等的初始概率并归一化,确保总和为1。 - 新增
counts向量跟踪每个事件的选中次数,用于后续高频事件的概率调整。
规则3:随机提升事件概率
- 先获取当前最高概率,随机选中一个事件后将其概率设为最高概率的
rateIncrease倍。 - 剩余概率按原有比例分配给其他事件,保证所有概率总和始终为1。
- 同步更新选中事件的计数。
规则4:高频事件概率加速下降
- 找出出现次数最多的事件,将其概率乘以
(1 - rateDecrease),其他事件概率乘以(1 - rateDecrease/2),实现高频事件更快衰减的效果。 - 重新归一化概率,确保总和维持为1。
规则5:随机引入高概率新事件
- 每次迭代有
newEventChance(默认20%)的概率触发新事件引入。 - 新事件名称自动生成(A-Z用完后采用
Event_数字格式),概率设为newEventProb(示例0.5)。 - 原有事件概率按比例缩放,总和调整为
1 - newEventProb,再加入新事件概率,最终总和保持1。
返回结果
- 返回一个列表,每个元素对应一次迭代后的完整状态,包含事件名称、保留4位小数的概率,以及各事件的选中次数。
使用示例
# 运行函数,迭代3次 event_result <- quasi_random_events(iter = 3) # 查看第一次迭代后的状态 print(event_result[[1]]) # 查看第三次迭代后的状态 print(event_result[[3]])
内容的提问来源于stack exchange,提问作者user17326436
相关产品推荐
相关产品推荐

