我希望能够生成一个(伪)随机二进制序列(例如,R和L的序列,如RLLRRLR),它被平衡,使得相同的项目在序列中不会连续出现两次以上,并且如果我,例如,有一个20个的序列,我得到每个序列中的10个.R中有没有一个函数可以做这样的事情?

我试着自己写一个这样的函数.以下是try :

RL_seq <- function(n_L = 10, n_R = 10, max_consec = 2, initial_seq = NULL) {
  while(n_L > 0 | n_R > 0){
    side <- sample(c("R", "L"), 1)
    
    if (side == "R" & n_R > 0 & length(grep("R", tail(initial_seq, max_consec))) != max_consec) {
      initial_seq <- append(initial_seq, side)
      n_R <- n_R - 1
    } else if (side == "L" & n_L > 0 & length(grep("L", tail(initial_seq, max_consec))) != max_consec) {
      initial_seq <- append(initial_seq, side)
      n_L <- n_L - 1
    }
  }
  print(initial_seq)
}

# The function does not stop with the following seed
set.seed(1)
RL_seq()

然而,代码是否卡住取决于运气.我还希望我可以改变序列的规则(例如,允许连续3个R),但如果我touch 参数,代码往往会中断.在这一点上,如果我可以使用默认参数运行它,而不是让它卡住,我会很高兴.

我找遍了,也找不到答案.如有任何帮助,我们不胜感激.另外,我对编程比较陌生,我是自学成才的,我以前从来没有在堆栈溢出上发布过任何东西,所以我提前道歉.

推荐答案

在这里,我首先确定元素的混合,然后反复洗牌,直到没有太多连续 Select 的情况下出现平局.我相信有一种计算效率更高的方法(例如,我们不会在每次迭代中覆盖seq个),但这可能就足够了.例如,max_consec = 2需要约0.002秒,或者几秒才能找到没有重复的抽奖(max_consec = 1),即使需要seqk+抽奖才能找到.

任何依赖随机抽取的方法(就像到目前为止建议的两种方法)对于较大的序列都将表现不佳,因为它将变得几乎不可能偶然发生在具有足够少重复字符串的序列上.

RL_seq <- function(n_L = 10, n_R = 10, max_consec = 2) {
  # make a sequence that is all the Ls then all the Rs
  seq = c(rep("L", n_L), rep("R", n_R))
  consec = max_consec + 1 # we know the first attempt won't work
  while(consec > max_consec) {
    # overwrite the sequence with a shuffle of it
    seq = sample(seq, length(seq), replace = FALSE)
    # what is the maximum "run length encoding" (rle) length of the sequence?
    consec = max(rle(seq)[1]$lengths)
  }
  seq
}


RL_seq()

R相关问答推荐

抖动点与嵌套类别变量箱形图的位置不对齐

r—绘制相交曲线

在R中使用数据集名称

如何在R中合并两个基准点?

条形图和在Ploly中悬停的问题

在ggplot中为不同几何体使用不同的 colored颜色 比例

如何通过判断数据框的一列来压缩另一列?

在不丢失空值的情况下取消列出嵌套列表

按多列统计频次

为什么我使用geom_density的绘图不能到达x轴?

R如何将列名转换为更好的年和月格式

将摘要图添加到facet_WRAP gglot的末尾

是否有可能从边界中找到一个点值?

Conditional documentr::R中数据帧的summarize()

访问数据帧中未定义的列时出现R错误

R try Catch in the loop-跳过缺少的值并创建一个DF,显示跳过的内容

有没有办法将勾选/审查标记添加到R中的累积关联图中?

从多行中 Select 最小值

使用nls()函数的非线性模型的半正态图

向数据添加标签