如何生成满足最小游程长度要求的二进制随机序列,现有R代码运行异常
R生成最小游程长度为2的01随机序列问题修复
原代码问题分析
原代码存在3个核心逻辑错误:
- 当新采样的
x[i]与前一位x[i-1]值不同时,直接强制将x[i]改为和x[i-1]一致,完全阻断了0和1之间的切换路径,极端情况会生成全0或全1的无效序列。 - 当新采样的
x[i]与前一位x[i-1]值相同时,又重新执行一次随机采样,主动推翻了原本符合要求的结果,有50%概率生成和前一位不同的值,反而制造了长度为1的无效游程。 - 完全没有跟踪当前连续游程的长度,切换数值的前提是上一个游程已经达到≥2的要求,原逻辑未做这个判断,即使修改前两个问题也无法保证合规。
修复后的实现代码
# 定义要生成的序列长度 n <- 100 x <- integer(n) # 初始化前两位为相同的随机值,保证第一个游程符合≥2的要求 first_val <- sample(c(0, 1), size = 1) x[1:2] <- first_val # 记录当前游程的数值和累计长度 current_val <- first_val run_length <- 2 for (i in 3:n) { if (run_length >= 2) { # 当前游程已经达标,可以随机选择保持当前值或切换值 next_val <- sample(c(current_val, 1 - current_val), size = 1, prob = c(0.5, 0.5)) if (next_val == current_val) { run_length <- run_length + 1 } else { current_val <- next_val run_length <- 1 } } else { # 当前游程长度不足2,必须保持当前值 next_val <- current_val run_length <- run_length + 1 } x[i] <- next_val } # 输出结果 print(x)
结果验证
可以用R内置的游程编码函数rle()快速验证结果是否符合要求,返回TRUE即为所有游程长度均≥2:
rle_result <- rle(x) all(rle_result$lengths >= 2)
内容的提问来源于stack exchange,提问作者Felipe Rodrigo
相关产品推荐
相关产品推荐

