2017-12-03 223 views
0

我試圖寫模擬高爾夫球的變形例的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編程課上,所以我還是很新的。

謝謝!

回答

0

也許這樣?您需要一個數組來存儲骰子的生成值。您需要兩個累加器來存儲總分數和所用骰子的數量。當您累計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;