执行循环 - 随机数两次生成相同的数字并且没有将其添加到 运行 总数中

Do loop - random number is generating the same number twice and isn't adding it in a running total

大家好,非常感谢你们的帮助!我在下面的代码 "simulation_tracking3" 之前有一个数据步骤,它输出如下内容:

CDFx Allowed_Claims
.06   120
.12   13
.15   1400

我的散列 table 根据随机生成的值(从 0 到 1)对 Allowed_Claims 进行平均。例如,我们称此过程 A,如果 Px = rand('Uniform',0,1) 产生 .09,我希望它在 Px = .06 和 Px = 0.12 的 Allowed_Claims 值之间取平均值,即 (120+13)/ 2

数组的作用是它决定了我想要的过程A的迭代次数。数组是

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);

因此当循环开始时,它将执行过程 A 的 5 次迭代,从而产生 5 个平均 "allowed_claims" 值。我要这五个索赔的总和。

然后,循环将继续并执行过程 A 的 6 次迭代并产生 6 个平均 "allowed_claims" 值。同样,我想要这 6 个索赔的总和。

输出 table 如下所示:

`

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

我的问题是,在倒数第二个和最后一个迭代中,它使用相同的随机值来生成允许的声明。它没有以 "running total" 格式总结。

例如,5 人组的第四次和第五次迭代具有相同的允许声明,6 人组的第五次和第六次迭代,等等。此外,输出中产生的数字 table 对应于 X 成员组,将允许的索赔值从第一次出现到倒数第二次相加。例如,对于 5 人组,允许的索赔总和为 1-4,而不是 1-5。

所以我看到的两个问题是:它不会生成唯一的随机值来计算允许的声明;它未能将最后一次出现添加到 运行 总数中。

生成的 5 成员值 table 如下所示:

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;

这与RNG无关,与编程逻辑有关。 它不是生成一个数字两次,而是将同一行输出两次。

删除具有 *drop unnecessary columns; 注释的 output,并更新循环以删除 -1.