Matlab中带2-back重复约束的试验序列生成需求
解决方案:迭代构建伪随机试验序列
核心思路
放弃暴力洗牌的低效方式,采用迭代贪心构建策略,逐一生成试验项,同时满足三个核心约束:
- 15个单词最终各出现40次
- 从第3次试验起,2-back重复率稳定在40%-60%区间内
- 避免提前耗尽某单词的可用次数
Matlab实现代码
% 参数配置 num_words = 15; total_trials = 600; trials_per_word = 40; target_2back_rate = 0.5; % 可在0.4-0.6之间调整 min_rate = 0.4; max_rate = 0.6; % 初始化剩余次数数组 remaining = ones(1, num_words) * trials_per_word; trial_sequence = zeros(1, total_trials); % 生成前两次试验(无2-back约束) trial_sequence(1) = randsample(find(remaining>0), 1); remaining(trial_sequence(1)) = remaining(trial_sequence(1)) - 1; trial_sequence(2) = randsample(find(remaining>0), 1); remaining(trial_sequence(2)) = remaining(trial_sequence(2)) - 1; % 统计2-back重复次数 count_2back = 0; % 迭代生成后续试验 for i = 3:total_trials % 计算当前已达成的2-back重复率 current_rate = count_2back / (i-2); % 决策本次是否生成2-back项 need_2back = false; if current_rate < target_2back_rate % 低于目标,提高生成2-back的概率 prob = min(0.9, (target_2back_rate - current_rate)*10); need_2back = rand < prob; elseif current_rate > max_rate % 超过上限,禁止生成2-back need_2back = false; elseif current_rate < min_rate % 低于下限,强制生成2-back(若可行) need_2back = true; else % 处于目标区间,按目标概率随机决策 need_2back = rand < target_2back_rate; end % 候选单词集合 candidates = find(remaining>0); if need_2back % 检查2-back目标单词是否还有剩余次数 target_word = trial_sequence(i-2); if remaining(target_word) > 0 trial_sequence(i) = target_word; remaining(target_word) = remaining(target_word) - 1; count_2back = count_2back + 1; else % 无法生成2-back,随机选其他候选 trial_sequence(i) = randsample(candidates, 1); remaining(trial_sequence(i)) = remaining(trial_sequence(i)) - 1; end else % 优先选择非2-back的单词 non_2back_candidates = candidates(candidates ~= trial_sequence(i-2)); if ~isempty(non_2back_candidates) trial_sequence(i) = randsample(non_2back_candidates, 1); remaining(trial_sequence(i)) = remaining(trial_sequence(i)) - 1; else % 只剩2-back单词可选,被迫选择并计入重复次数 trial_sequence(i) = trial_sequence(i-2); remaining(trial_sequence(i)) = remaining(trial_sequence(i)) - 1; count_2back = count_2back + 1; end end end % 结果验证 fprintf('总试验数:%d\n', length(trial_sequence)); fprintf('各单词出现次数:\n'); disp(histcounts(trial_sequence, 1:num_words)); final_2back_rate = count_2back / (total_trials - 2); fprintf('最终2-back重复率:%.2f%%\n', final_2back_rate*100);
关键细节说明
- 前两次试验:随机选择单词,不施加2-back约束,为后续序列提供初始基础
- 动态概率调整:根据当前已达成的重复率,实时调整生成2-back项的概率,确保最终重复率落在要求区间内
- 资源约束处理:每次选择单词前检查剩余次数,避免出现某单词提前耗尽的情况,保证所有单词最终恰好出现40次
- 结果验证:生成序列后自动统计核心指标,确认是否符合要求
效率优势
暴力洗牌法需要反复生成随机序列并验证约束,时间复杂度极高;而迭代构建法的时间复杂度为O(n)(n为试验次数),600次试验可在毫秒级完成,彻底解决耗时问题。
内容的提问来源于stack exchange,提问作者caunuk
相关产品推荐
相关产品推荐

