使用变量迭代执行循环 (SAS)
Do loop with variable iteration (SAS)
我正在尝试编写一个 SAS 程序来模拟高尔夫的变化,每半场 9 洞:
对于 9 个孔中的 1 个一半:
从九个十二面骰子开始,骰子的值为 -1,0,1,2,3,4,概率为常量。
选择具有最小值的骰子,并将它们存储到一个数组中。
移除许多具有最低值的骰子(即,如果 0 是最低值,并且有 3 个,则第二次迭代只剩下 6 个骰子)。重复直到数组有 9 个元素。
将这些分数相加得到上半场的分数。
我能够编写以下代码,每轮取最低分,然后每轮移除一个骰子(1 半总共 9 轮)。但我不知道如何更改或调整它,以便每轮可以移除不同数量的骰子(因此总轮数 <= 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;
我正在考虑定义一个没有指定数量元素的数组,并有一个结束条件为 dim(array) = 9 的外部 do while 循环。但我不确定如何定义要有多少元素每次删除。
有人可以就如何处理这个问题给我一些建议吗?我在 SAS 编程入门研究生 class,所以我对此还是很陌生。
谢谢!
也许是这样的?您需要一个数组来存储骰子的生成值。您需要两个累加器来存储总分和使用的骰子数。当你累积了 9 分时,你需要添加逻辑来终止循环。您还可以使用所选骰子数量的计数来控制生成骰子掷骰的循环。因此,如果您已经 "used" 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;
我正在尝试编写一个 SAS 程序来模拟高尔夫的变化,每半场 9 洞:
对于 9 个孔中的 1 个一半:
从九个十二面骰子开始,骰子的值为 -1,0,1,2,3,4,概率为常量。
选择具有最小值的骰子,并将它们存储到一个数组中。
移除许多具有最低值的骰子(即,如果 0 是最低值,并且有 3 个,则第二次迭代只剩下 6 个骰子)。重复直到数组有 9 个元素。
将这些分数相加得到上半场的分数。
我能够编写以下代码,每轮取最低分,然后每轮移除一个骰子(1 半总共 9 轮)。但我不知道如何更改或调整它,以便每轮可以移除不同数量的骰子(因此总轮数 <= 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;
我正在考虑定义一个没有指定数量元素的数组,并有一个结束条件为 dim(array) = 9 的外部 do while 循环。但我不确定如何定义要有多少元素每次删除。
有人可以就如何处理这个问题给我一些建议吗?我在 SAS 编程入门研究生 class,所以我对此还是很陌生。
谢谢!
也许是这样的?您需要一个数组来存储骰子的生成值。您需要两个累加器来存储总分和使用的骰子数。当你累积了 9 分时,你需要添加逻辑来终止循环。您还可以使用所选骰子数量的计数来控制生成骰子掷骰的循环。因此,如果您已经 "used" 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;