Julia中如何按分组生成无放回随机整数并优化多分组冗余代码
实现方案
最简实现(和你原有写法逻辑完全一致,适配大m值场景)
默认n可以被m整除的场景下,用列表推导+批量拼接即可自动完成所有分组的采样和合并,不需要手动定义每个分组变量,m取任意大值都可直接运行:
using Distributions n = 10000 m = 100 # 可替换为任意符合条件的分组数 k = n ÷ m # 自动计算每个分组的元素数量 # 自动生成所有分组采样结果后拼接为最终数组 order = vcat([sample((i-1)*k + 1 : i*k, k, replace=false) for i in 1:m]...)
无额外依赖的标准库实现
如果不想引入第三方包,对全区间做无放回全量采样等价于打乱区间顺序,可以直接用Julia标准库Random的shuffle方法实现,逻辑和性能完全一致:
using Random n = 10000 m = 100 k = n ÷ m order = vcat([shuffle((i-1)*k + 1 : i*k) for i in 1:m]...)
兼容n不能被m整除的鲁棒版本
如果存在n无法被m整除的场景,可以用下面的通用函数自动处理最后一个分组的长度:
using Random # 若要沿用Distributions的sample写法,替换这行引入即可 function group_shuffle(n::Int, m::Int) res = sizehint!(Int[], n) prev = 0 for i in 1:m curr_end = i == m ? n : prev + n ÷ m # 如果用Distributions包,把shuffle替换为sample(prev+1:curr_end, curr_end-prev, replace=false)即可 append!(res, shuffle(prev+1:curr_end)) prev = curr_end end return res end # 调用示例 order = group_shuffle(10000, 100)
内容的提问来源于stack exchange,提问作者Mizzle
相关产品推荐
相关产品推荐

