执行循环 - 随机数两次生成相同的数字并且没有将其添加到 运行 总数中
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
.
大家好,非常感谢你们的帮助!我在下面的代码 "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
.