1

SAS/IML 似乎有能力重置它的随机数流(文档链接)。

SAS 数据步骤中的随机数例程是否有类似的功能?

根据这篇文章,似乎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 
4

3 回答 3

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;

显然更容易/更好地编写一个宏来完成这部分。

不幸的是,这是“新”兰德例程的一个限制。在这方面,旧的更容易使用(因为它实际上只有一个种子)。新的种子属性更复杂,所以虽然你可以用一个数字初始化它,但它并不那么简单,因此很复杂。

于 2017-12-04T18:21:55.730 回答
1

您无法在 SAS 9.4M4 中重置 RAND 函数的流。但是,您可以使用新的STREAMREWIND 例程在 SAS 9.4M5(2017 年 9 月发布)中倒带流。 以下程序显示了语法:

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;
于 2017-12-05T13:55:46.380 回答
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
于 2017-12-04T19:05:11.493 回答