如何实现向量随机重排且相同元素连续出现次数最多不超过2次
实现思路
- 拒绝采样方案:直接对原始向量做全随机重排,校验结果是否符合连续重复次数约束,不符合就重新生成,直到拿到合规结果。实现逻辑极简,你当前10个1、10个2的场景下,生成无效排列的概率很低,性能完全够用。
- 增量构造方案:逐位生成结果,每次从剩余未使用的元素中随机挑选,校验该元素和当前结果末尾的连续重复次数是否超过阈值,符合要求就放入结果、扣除对应元素的剩余计数,否则重新挑选。适合元素种类多、计数差距大的场景,不会生成无效全排列浪费算力。
Matlab 实现代码(拒绝采样版,适配你的场景)
% 初始化参数 vec = [ones(1,10), 2 * ones(1,10)]; atmost = 2; while true % 生成随机排列 rand_vec = vec(randperm(length(vec))); % 计算当前排列的最大连续重复次数 diff_val = diff(rand_vec); % 统计连续相同元素的最大长度 run_len = max(accumarray(cumsum([1, diff_val ~= 0])', 1)); if run_len <= atmost vec = rand_vec; break; end end % 输出验证 disp(vec)
注意事项
使用前请先确认约束存在可行解,否则代码会进入死循环。解的判定规则为:数量最多的一类元素的总个数,不超过 (数量最少的一类元素总个数 + 1) * 最大允许连续次数,你当前的场景两类元素数量均为10,阈值为2,完全符合解的要求,可放心使用。
内容的提问来源于stack exchange,提问作者Likeunknown
相关产品推荐
相关产品推荐

