You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Matlab中带2-back重复约束的试验序列生成需求

解决方案:迭代构建伪随机试验序列

核心思路

放弃暴力洗牌的低效方式,采用迭代贪心构建策略,逐一生成试验项,同时满足三个核心约束:

  1. 15个单词最终各出现40次
  2. 从第3次试验起,2-back重复率稳定在40%-60%区间内
  3. 避免提前耗尽某单词的可用次数

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 21:33:22