SAS / IML似乎能够重置它的随机数流(doc link)。
SAS数据步骤中的随机数例程是否有类似功能?
基于this post,,似乎在单个datastep中忽略了对streaminit
的后续调用。
例如,下面的代码为每一行产生不同的随机数:
data want;
do i = 1 to 2;
call streaminit(123); * <-- WANT THIS TO RESET THE STREAM;
ran1 = rand('uniform');
ran2 = rand('uniform');
ran3 = rand('uniform');
put _all_;
output;
end;
run;
输出:
i=1 ran1=0.5817000773 ran2=0.0356216603 ran3=0.0781806207
i=2 ran1=0.3878454913 ran2=0.3291709244 ran3=0.3615948586
我希望输出为:
i=1 ran1=0.5817000773 ran2=0.0356216603 ran3=0.0781806207
i=2 ran1=0.5817000773 ran2=0.0356216603 ran3=0.0781806207
答案 0 :(得分:1)
您可以使用生成的代码解决此问题,例如,使用CALL EXECUTE或DOSUBL,
data _null_;
do i = 1 to 2;
rc=dosubl(cats("data want_",i,";
call streaminit(123); * <-- WANT THIS TO RESET THE STREAM;
ran1 = rand('uniform');
ran2 = rand('uniform');
ran3 = rand('uniform');
i=",i,";
put _all_;
output;
run;
"));
end;
rc = dosubl("data want; set want_1 want_2; run;");
run;
显然更容易/更好地编写宏来完成这一部分。
不幸的是,这是“新”兰德例程的限制;在这方面,旧的更容易合作(因为它实际上只有一颗种子)。新的种子属性更复杂,因此虽然您可以使用单个数字初始化它,但它并不那么简单,因此会出现复杂情况。
答案 1 :(得分:1)
您无法在SAS 9.4M4中重置RAND功能的流。但是,可以使用新的which shipped in Sep 2017在SAS 9.4M5(STREAMREWIND routine.)中回放流。以下程序显示语法:
data want;
call streaminit(123);
do i = 1 to 2;
call streamrewind;
ran1 = rand('uniform');
ran2 = rand('uniform');
ran3 = rand('uniform');
put _all_;
output;
end;
run;
答案 2 :(得分:0)
您可以使用call ranuni
为两个不同的随机数流使用相同的种子。
请注意,这使用了一个不同的,较差的PRNG,其循环周期短,统计特性比rand()
函数差。
示例:
data x;
seed1 = 123;
seed2 = 123;
do i =1 to 3;
call ranuni(seed1, x);
call ranuni(seed2, y);
output;
end;
run;
输出:
i=1 x=0.7503960881 y=0.7503960881
i=2 x=0.3209120251 y=0.3209120251
i=3 x=0.178389649 y=0.178389649