修改R代码:统计所有数字被抽取至少两次所需次数
修改R代码以统计每个数字被看到至少两次的抽取次数
原代码实现了收集1-100所有数字至少一次的抽取次数,要改成统计每个数字至少出现两次,核心是追踪每个数字的出现次数,而非仅判断是否出现过。以下是两种修改方案:
方案1:使用table更新计数(可读性强)
numbers <- 1:100 counts <- rep(0, length(numbers)) # 初始化每个数字的计数为0 names(counts) <- numbers # 给计数向量命名,对应1-100的数字 counter <- 0 while(any(counts < 2)) { # 循环条件:只要有数字出现次数不足2次就继续抽取 new_sample <- sample(numbers, 5, replace = TRUE) # 统计本次抽取的各数字出现次数,并更新总计数 sample_counts <- table(new_sample) counts[names(sample_counts)] <- counts[names(sample_counts)] + sample_counts counter <- counter + 1 cat("Draw", counter, ":", paste(new_sample, collapse = ", "), "\n") } cat("All numbers have been seen at least twice after", counter, "draws.")
方案2:使用tabulate更新计数(性能更优)
针对1-100连续整数的场景,tabulate函数比table更高效:
numbers <- 1:100 counts <- integer(length(numbers)) # 初始化整数型计数向量,内存占用更低 counter <- 0 while(any(counts < 2)) { new_sample <- sample(numbers, 5, replace = TRUE) # 直接用tabulate统计本次抽取的数字频次,累加至总计数 counts <- counts + tabulate(new_sample, nbins = length(numbers)) counter <- counter + 1 cat("Draw", counter, ":", paste(new_sample, collapse = ", "), "\n") } cat("All numbers have been seen at least twice after", counter, "draws.")
关键修改点
- 新增
counts向量替代原代码的sampled向量,专门追踪每个数字的出现次数,避免向量无限增长导致的性能问题。 - 循环条件从判断
unique(sampled)的长度,改为检查any(counts < 2)——只要存在数字出现次数不足2次,就继续循环。 - 每次抽取后直接更新对应数字的计数,而非累加所有抽取结果后再统计,效率更高。
内容的提问来源于stack exchange,提问作者SiuMai2k22
相关产品推荐
相关产品推荐

