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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 12:06:02