使用变量迭代循环 (SAS)

分数

我正在尝试编写一个模拟高尔夫变体的 SAS 程序,每个 9 洞的 2 个半场:

对于 9 洞的一半:

  1. 从具有恒定概率的值 -1、0、1、2、3、4 的九个十二面骰子开始。

  2. 选择具有最低值的骰子,并将它们存储到一个数组中。

  3. 删除具有最低值的骰子(即,如果 0 是最低值,并且其中有 3 个,则第二次迭代只剩下 6 个骰子)。重复直到数组有 9 个元素。

  4. 将这些分数相加得到上半场的分数。

我能够编写以下代码,在每一轮中获得最低分,然后每轮移除一个骰子(1 半共 9 轮)。但我不知道如何更改或调整它,以便每轮可以移除不同数量的骰子(因此总轮数 <= 9)。

do i = 1 to 9; 

  do j = 9 to 1 by -1; 

       if i - j <= 0 then 
           dice(j) = rantbl(seed, p1n, p0, p1, p2, p3, p4) - 2; 
       else dice(j) = 100;
  end;

  half1(i) = min(of dice1-dice9);

end;

我想定义一个没有指定元素数量的数组,并有一个外部 do while 循环,结束条件为 dim(array) = 9。但我不确定如何定义每次要删除多少个元素。

有人可以就如何解决这个问题给我一些建议吗?我正在上一门介绍性的研究生 SAS 编程课程,所以我对此还是很陌生。

谢谢!

汤姆

也许像这样?您需要一个数组来存储骰子的生成值。您需要两个累加器来存储总分和使用的骰子数量。当你累积了 9 个分数时,你需要添加逻辑来终止循环。您还可以使用所选骰子数量的计数来控制生成掷骰子的循环。因此,如果您已经“使用”了 5 个值,那么您只需要生成 4 个随机值。

data test;
  if _n_=1 then call streaminit(12345);        /* use default method */
* simulate 5 "rounds" or "half-rounds" ;
do round=1 to 5;
  put / round= ;
  nscore= 0;
  score=0;
  array dice (9) _temporary_;
  do roll=1 to 9 while (nscore < 9) ;
    put  'Start ' roll= score= nscore= @;
    * roll ;
    call missing(of dice(*));
    do i=nscore+1 to 9 ;
      dice(i) = ceil(6*rand('uniform'))-2;
    end;
    * Find minimum ;
    min1 = min(of dice(*));
    do i=nscore+1 to 9 while (nscore < 9) ;
      if dice(i)=min1 then do;
        score=sum(score,min1);
        nscore=sum(nscore,1);
      end;
    end;
    put ' End ' roll= score= nscore=;
  end;
  output;
end;
run; 

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章