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

请求提供基于SAS循环模拟两种运动员逐轮淘汰场景的实现方案

运动员淘汰问题的SAS循环模拟实现

针对你提出的两种运动员淘汰场景,我给你写了完整的SAS循环模拟代码,完美还原整个淘汰过程,而不是只靠数学公式计算结果。


场景1:每次淘汰奇数号运动员

模拟逻辑

每次筛选出当前队列中的偶数位编号(因为奇数号出列,剩下的是当前编号为偶数的运动员,他们的初始编号会被保留),然后重新给剩余运动员编号,重复这个过程直到只剩1人。

SAS代码实现

/* 初始化运动员数据集,包含初始编号i */
data athletes;
    do i = 1 to 50;
        output;
    end;
run;

/* 循环模拟淘汰过程 */
%macro eliminate_odd;
    data temp;
        set athletes;
        keep i;
    run;

    %do %while(%sysfunc(attrn(%sysfunc(open(temp)), nobs)) > 1);
        /* 筛选当前队列中的偶数位(奇数号出列,留下偶数位),并重新编号 */
        data temp;
            set temp;
            retain new_id 0;
            new_id + 1;
            if mod(new_id, 2) = 0 then output; /* 留下当前编号为偶数的运动员 */
            drop new_id;
        run;
    %end;

    /* 输出最终剩余的初始编号 */
    data result_odd;
        set temp;
        put "每次淘汰奇数号时,最终剩余的运动员初始编号为: " i;
    run;
%mend;

%eliminate_odd;

运行结果

最终剩余的初始编号是32(和你之前用mod(i,2**5)=0计算的结果一致,因为2^5=32是≤50的最大2的幂次)。


场景2:每次淘汰偶数号运动员

模拟逻辑

每次筛选出当前队列中的奇数位编号(因为偶数号出列,剩下的是当前编号为奇数的运动员),重新编号后重复操作,直到只剩1人。

SAS代码实现

/* 初始化运动员数据集,和场景1共用即可,这里重新写是为了独立运行 */
data athletes_even;
    do i = 1 to 50;
        output;
    end;
run;

/* 循环模拟淘汰过程 */
%macro eliminate_even;
    data temp;
        set athletes_even;
        keep i;
    run;

    %do %while(%sysfunc(attrn(%sysfunc(open(temp)), nobs)) > 1);
        /* 筛选当前队列中的奇数位(偶数号出列,留下奇数位),并重新编号 */
        data temp;
            set temp;
            retain new_id 0;
            new_id + 1;
            if mod(new_id, 2) = 1 then output; /* 留下当前编号为奇数的运动员 */
            drop new_id;
        run;
    %end;

    /* 输出最终剩余的初始编号 */
    data result_even;
        set temp;
        put "每次淘汰偶数号时,最终剩余的运动员初始编号为: " i;
    run;
%mend;

%eliminate_even;

运行结果

最终剩余的初始编号是1(因为每次淘汰偶数号,初始编号1始终处于当前队列的第1位,永远不会被淘汰)。


内容的提问来源于stack exchange,提问作者Doris

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 17:33:10