重置随机数流

时间:2017-12-04 18:13:46

标签: random sas sas-iml

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 

3 个答案:

答案 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