Do循环与可变迭代(SAS)

问题描述:

我试图写模拟高尔夫球的变形例的SAS程序,2个半部的每9个孔:Do循环与可变迭代(SAS)

对于1个半9洞:

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

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

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

  4. 将这些分数汇总在一起得到上半场得分。

我能写出下面的代码,每轮取最低分,然后每轮取消一个骰子(总共9轮1半)。但是我不知道我该如何改变它,或者改变它,以便每轮可以移除不同数量的骰子(因此总轮数< = 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循环与暗淡(阵列)的结束条件= 9。但我不知道如何确定有多少元素每次删除。

有人可以给我一些关于如何解决这个问题的建议吗?我在SAS入门级的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;