Цикл с переменной итерацией (SAS)

Я пытаюсь написать программу SAS, которая имитирует разновидность гольфа для 2 половин по 9 лунок в каждой:

Для 1 половины из 9 лунок:

  1. Начните с девяти двенадцатигранных кубиков со значениями -1,0,1,2,3,4 с постоянными вероятностями.

  2. Выберите кости с наименьшими значениями и сохраните их в массиве.

  3. Удалите столько кубиков, у которых было наименьшее значение (т. е. если 0 был наименьшим значением, а их было 3, для 2-й итерации осталось только 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 с конечным условием dim(array) = 9. Но я не уверен, как определить, сколько элементов удалять каждый раз.

Может ли кто-нибудь дать мне несколько советов о том, как подойти к этому? Я учусь на вводном курсе программирования SAS для выпускников, поэтому я все еще новичок в этом.

Спасибо!


person Score    schedule 03.12.2017    source источник


Ответы (1)


Возможно, что-то вроде этого? Вам нужен один массив для хранения сгенерированных значений игральных костей. Вам нужно два аккумулятора для хранения общего счета и количества использованных кубиков. Вам нужно добавить логику, чтобы завершить цикл, когда вы накопите 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; 
person Tom    schedule 03.12.2017