使用变量迭代(SAS)进行循环

时间:2017-12-03 03:57:22

标签: sas do-loops

我正在尝试编写一个模拟高尔夫变体的SAS程序,每个程序包含9个孔的两半:

9洞的一半:

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

  2. 选择值最小的骰子,并将它们存储到数组中。

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

  4. 将这些分数加在一起得到上半部分。

  5. 我能够编写以下代码,每轮获得最低分,然后每轮删除一个骰子(一半中总共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编程课程,所以我对此仍然很陌生。

    谢谢!

1 个答案:

答案 0 :(得分:0)

也许是这样的?您需要一个数组来存储生成的骰子值。您需要两个累加器来存储总分和使用的骰子数。当您累积了9个分数时,您需要添加逻辑来终止循环。您可以使用所选骰子数的计数来控制生成骰子卷的循环。所以,如果你已经&#34;使用&#34; 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;