Цикл Do - случайное число генерирует одно и то же число дважды и не добавляет его в промежуточную сумму

Эй, ребята, спасибо вам большое, заранее, за вашу помощь! У меня есть шаг данных перед приведенным ниже кодом под названием «simulation_tracking3», который выводит что-то вроде:

CDFx Allowed_Claims
.06   120
.12   13
.15   1400

Моя хеш-таблица усредняет Allowed_Claims на основе случайно сгенерированного значения (от 0 до 1). Например, давайте назовем этот Процесс А, если Px = rand('Uniform',0,1) дает 0,09, я хочу, чтобы он усреднялся между значениями Allowed_Claims, где Px = 0,06 и Px = 0,12, что составляет (120+13)/2.

Роль массива заключается в том, что он диктует, сколько итераций Процесса А я хочу. Массив

Members {24} _temporary_ (5 6 8 10 12 15 20 25 30 40 50 60 70 80 
                                    90 100 125 150 175 200 250 300 400 500);

Таким образом, когда цикл запускается, он выполняет 5 итераций процесса А, тем самым создавая 5 усредненных значений «разрешенных_притязаний». Мне нужна сумма этих пяти претензий.

Затем цикл продолжится и выполнит 6 итераций процесса A и выдаст 6 усредненных значений «allowed_claims». Опять же, я хочу сумму этих 6 претензий.

Выходная таблица выглядит так:

`

Member[i]    Average_Expected_Claims
   5              (sum of 5 'averaged 'claims) 
   6              (sum of 6 'averaged' claims) 
   8              (sum of 8 'averaged' claims) 

Моя проблема в том, что на предпоследней и последней итерации используется одно и то же случайное значение для генерации разрешенных утверждений. и это не подводит итог в формате «промежуточного итога».

Например, четвертая и пятая итерации для группы из 5 участников имеют одинаковые разрешенные заявки, пятая и шестая для группы из 6 участников и т. д. суммирует допустимое значение утверждений от первого вхождения до второго и до последнего. Например, для группы из 5 человек сумма допустимых требований составляет от 1 до 4, а не от 1 до 5.

Таким образом, я вижу две проблемы: он не генерирует уникальное случайное значение для расчета допустимых требований; ему не удается добавить последнее вхождение к промежуточной сумме.

Значения для сгенерированной таблицы из 5 элементов выглядят следующим образом:

allowed_claims  _i_simul  rand_value    ac_average
805.61154253      1       0.4518515905  805.61154253
805.61154253      2       0.2017115643  0
5091.2264605      3       0.7019698818  4285.614918
8207.1931206      4       0.6518877812  3115.9666601
8207.1931206      5       0.6518877812  3115.9666601

Ниже мой код:

data simulation_members; *simulates allowed claims for each member in member array;  
    call streaminit(454); 
        array members [24] _temporary_ (5 6 8 10 12 15 20 25 30 40 50 
                                        60 70 80 90 100 125 150 175 200 250 300 400 500);  *any number of members here is fine;
if _n_ eq 1 then do; * initiliaze the hash tables;
if 0 then set simulation_tracking3; * defines the variables used; 
    declare hash _iter(dataset:'simulation_tracking3', ordered: 'a'); *ordered = ascending - do not need a sort first; 
        _iter.defineKey('CDFx');                    * key is artificial, but has to exist;
        _iter.defineData('CDFx','Allowed_Claims');  * data variables to retrieve;
        _iter.defineDone();
        declare hiter hi_iter('_iter');            * the iterator object;
end;


    do _i_member = 1 to dim(members);            * iterate over members array;
        call missing(claims_simulated);
            do _i_simul = 1 to members[_i_member]-1;
                rand_value = rand('Uniform',0,1);
                do rc = hi_iter.first() by 0 until (hi_iter.next() ne 0 or CDFx gt rand_value);
end;
                ac_max = allowed_claims; 
                rc = hi_iter.prev();
                ac_min = allowed_claims;
                ac_average = mean(ac_max,ac_min);
                claims_simulated + ac_average;
             put rand_value= claims_simulated=;                 *just for logging;
             output; 
         end; 
    putlog; 
output; *drop unnecessary columns; 
end; 
stop;
run;

person indiansrulz    schedule 12.06.2017    source источник


Ответы (1)


Это не имеет ничего общего с ГСЧ и все, что связано с логикой программирования. Это не генерирует число дважды, вы дважды выводите одну и ту же строку.

Удалите output с комментарием *drop unnecessary columns; и обновите цикл, чтобы удалить -1.

person Joe    schedule 12.06.2017
comment
Спасибо, Джо. Итак, output, который я удалил, что он делал? - person indiansrulz; 12.06.2017
comment
Вывод строки в набор данных — в данном случае лишней. (output — это то, что говорит SAS на самом деле записать что-то в целевой набор данных. Если у вас нет оператора output, он предполагает, что он есть в run;, но в противном случае он записывает так часто, как вы ему говорите.) - person Joe; 12.06.2017
comment
Ох, ну ладно. теперь это имеет больше смысла. Спасибо за вашу помощь! - person indiansrulz; 12.06.2017
comment
Привет, Джо, как мне сделать так, чтобы на выходе снова отображались итоги? Я получаю правильные итоги, но _i_simul отображается как 6,7,9 и т. д. а не 5,6,8. - person indiansrulz; 12.06.2017
comment
Он всегда будет на единицу выше, потому что он выходит из цикла, когда условие while, to или until равно false. Таким образом, количество испытаний будет на единицу меньше, чем переменная цикла. - person Joe; 12.06.2017