2017-12-03 15 views
0

私は9ホールごとの2つの半分のために、ゴルフの変化をシミュレートSASプログラムを記述しようとしています:変数反復(SAS)でループを実行してください

9つのホールの1半分のために:

  1. 一定の確率で値が-1,0,1,2,3,4の9面の12面のダイから始めます。

  2. 最低の値を持つダイスを選び、それらを配列に格納します。しかし、多くのダイスが最も低い値を有していた(すなわち、0が最も低い値であり、それらの3つがあった場合、2回目の反復に対してわずか6ダイスしか残っていない)。配列に9つの要素があるまで繰り返す。

  3. これらのスコアを合計して、前半のスコアを取得します。

I(1半分の9回の合計)ラウンドごとに1個のダイスを除去し、その後、各ラウンドの最低のスコアを取った次のコードを書くことができました。しかし、私はどのように変更することができるか、またはそれを適応させることができないので、ラウンドごとにさまざまな数のサイコロを取り除くことができます(総ラウンド数< = 9)。 DIM(配列)の終了条件とループが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; 
私は要素の指定された番号なしで配列を定義し、外側を有していると考えていた

を行うしかし、私はどのように多くの定義方法を確認していません毎回削除する要素。

誰かが私にこのアプローチにどのようなアドバイスをあげることができますか?私は入門卒業生のSASプログラミングクラスに入っているので、まだこれはかなり新しいです。

ありがとうございます!

答えて

0

おそらくこのようなものでしょうか?生成されたダイスの値を格納する配列が1つ必要です。合計得点と使用するサイコロの数を格納するには、2つのアキュムレータが必要です。ループを終了させるロジックを追加する必要があります。選択したサイコロの数を使用して、サイコロを生成するループを制御することもできます。したがって、すでに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; 
関連する問題