You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 11:40:34