生成满足双条件的随机表格:首次迭代后type向量为空问题求助
问题分析与解决方案
原代码的核心问题是循环逻辑完全混乱,导致type向量被无意义地反复删除元素直到为空:
- 嵌套的
for和while循环一直在修改同一行的type和qty,每次修改都会从type里删掉选中的元素,相当于把270个type挨个试一遍,直到type被掏空。 - 累计总和的判断逻辑错误,只检查当前行的
qty是否≤total,而不是所有行的总和。 - 初始化时给第一行赋值的
1也不符合需求,会干扰累计总和的计算。
修正后的代码
下面的代码会生成符合要求的随机表格:
total <- 20 qty_options <- c(2, 3, 4, 5) available_types <- 1:270 # 初始化空数据框 gen_table <- data.frame(type = integer(), qty = integer()) current_sum <- 0 # 循环生成行,直到无法再添加符合条件的行 while (current_sum + min(qty_options) <= total && length(available_types) > 0) { # 随机选一个未使用的type selected_type <- sample(available_types, 1) # 随机选qty selected_qty <- sample(qty_options, 1) # 检查添加后总和是否不超过total if (current_sum + selected_qty <= total) { # 添加到表格 gen_table <- rbind(gen_table, data.frame(type = selected_type, qty = selected_qty)) # 更新累计总和 current_sum <- current_sum + selected_qty # 从可用type中移除已选的 available_types <- available_types[available_types != selected_type] } } # 查看结果 gen_table
代码说明
- 循环条件确保:剩余可用type不为空,且即使选最小的qty也不会超过total,避免无效循环。
- 每次只生成一行新数据,确保
type唯一(选完就从可用列表移除)。 - 只有当选中的qty加上当前总和不超过total时,才会添加这一行,严格满足需求。
内容的提问来源于stack exchange,提问作者onhalu
相关产品推荐
相关产品推荐

