如何在R中生成首数1-12、次1-4的不重复双随机数对
实现思路和代码示例
思路1:预枚举所有组合+无放回抽样(推荐)
你的场景总共有12*4=48种不重复的数对,完全可以先枚举所有合法组合,直接无放回抽取需要的数量即可,不用自己写校验逻辑,性能高也不会出错。
# 生成所有可能的不重复数对 all_pairs <- expand.grid(first = 1:12, second = 1:4) # 比如要抽取10个不重复数对,直接无放回采样 n_need <- 10 sampled_pairs <- all_pairs[sample(nrow(all_pairs), n_need, replace = FALSE), ] # 如果需要转成列表格式的数对,可以加这步 sampled_pairs_list <- lapply(1:nrow(sampled_pairs), function(i) c(sampled_pairs$first[i], sampled_pairs$second[i]))
思路2:动态校验重抽(适合组合量极大的通用场景)
如果后续遇到组合数太大没法预生成的场景,可以用循环+已抽取集合校验的方式实现:
# 要抽取的数对数量 n_need <- 10 # 存储已抽取的数对,初始为空 used_pairs <- list() # 循环直到抽够需要的数量 while(length(used_pairs) < n_need) { # 生成新数对 new_pair <- c(sample(1:12, 1, replace = T), sample(1:4, 1, replace = T)) # 校验是否已存在 is_duplicate <- any(sapply(used_pairs, function(p) identical(p, new_pair))) # 不存在就加入已抽取列表 if(!is_duplicate) { used_pairs <- append(used_pairs, list(new_pair)) } } # 最终结果存在used_pairs中
注意:如果要抽取的数量超过总合法组合数(你的场景是48),逻辑上不可能实现,会进入死循环,建议使用前先判断抽取数量不大于总组合数。
内容的提问来源于stack exchange,提问作者wcbrown
相关产品推荐
相关产品推荐

