SAS中文论坛

标题: 如何把产生的各种随机数值赋给一个宏变量 [打印本页]

作者: shiyiming    时间: 2011-4-2 15:09
标题: 如何把产生的各种随机数值赋给一个宏变量
如何把产生的各种随机数值赋给一个宏变量,而不是把产生随机数的函数当成字符赋给某个宏变量!!!
比如:这种%let x1=rand('exponential');只会把 rand('exponential') 字符赋值给宏变量x1,达不到想要的结果。
我也随便试过一些sas宏的通配函数,计算函数等,不过没成功!
比如下面给出的一些错误代码:
%let x1=rand('exponential');
%let x1=%sysevalf(&x1);
%let x1=%sysfunc(rand('exponential'));

请问各位大侠有没有什么办法,让产生的各种随机数值赋给一个宏变量!!
作者: Qiong    时间: 2011-4-2 15:28
标题: Re: 如何把产生的各种随机数值赋给一个宏变量
data _null_;
call symput("x1",rand('exponential'));
run;
%put &x1;
作者: shiyiming    时间: 2011-4-2 18:35
标题: Re: 如何把产生的各种随机数值赋给一个宏变量
你为什么要加引号泥~

%let x1=%sysfunc(rand(exponential));
%put &x1;
作者: shiyiming    时间: 2011-4-2 19:05
标题: Re: 如何把产生的各种随机数值赋给一个宏变量
[quote="superkuhasu":1u0uzdtk]你为什么要加引号泥~

%let x1=%sysfunc(rand(exponential));
%put &x1;[/quote:1u0uzdtk]

那加了引号出错的原因又是什么哎?? 请大侠指教!
作者: shiyiming    时间: 2011-4-2 19:06
标题: Re: 如何把产生的各种随机数值赋给一个宏变量
[quote="vicky1020":ttge4yjw]data _null_;
call symput("x1",rand('exponential'));
run;
%put &x1;[/quote:ttge4yjw]

多谢大侠哈!!!
作者: shiyiming    时间: 2011-4-2 21:50
标题: Re: 如何把产生的各种随机数值赋给一个宏变量
[quote="天性爱好者":1xmnksyo][quote="superkuhasu":1xmnksyo]你为什么要加引号泥~

%let x1=%sysfunc(rand(exponential));
%put &x1;[/quote:1xmnksyo]

那加了引号出错的原因又是什么哎?? 请大侠指教![/quote:1xmnksyo]

我想,通常的规则是不加引号。但这并不是说加上引号就一定错误。比如
[code:1xmnksyo]%let x2 =have;
%macro  abc;
%if not %sysfunc(fileexist("&x2")) %then %put no;
%else %put yes;
%mend abc;

%abc;[/code:1xmnksyo]
如果&x2=have的确存在,结果当然是yes。同样,不加引号也是对的。
其实sas对此并没有明确的说明,大概只是类似这样话,“因为%sysfunc是macro方程,所以引号是不必要的。”对于我们来讲,也可以依靠试错法来鉴别其是否正确。

另外值得注意的是%sysfunc是内含format的。比如
[code:1xmnksyo]%let x11=%sysfunc(rand(exponential), best8.);
%let x12=%sysfunc(rand(exponential), best12.);[/code:1xmnksyo]
可以籍此来改变输出的精度。而这一点是至关重要的,因为此时输出的是字符类型的数字。

京剧
作者: shiyiming    时间: 2011-4-2 23:46
标题: Re: 如何把产生的各种随机数值赋给一个宏变量
多谢京剧大侠的回帖,让我了解到了更多!

前边的问题基本上解决了,不过小弟的遇到的新问题又来了!
想完成下面的一段程序,主要是想在data步中分别调用这些宏变量:
注:都是错误代码
data _null_;
   array xa{5} xa1-xa5;
   do i=1 to 5;
     %let xa(i)=%sysfunc(rand(exponential));
   end;
run;
或者:
%do i=1 %to 5;
    %let xa&i=%sysfunc(rand(exponential));
%end;
作者: shiyiming    时间: 2011-4-3 00:13
标题: Re: 如何把产生的各种随机数值赋给一个宏变量
%let 语句在data step里的用法说来话长。你的第二个程序是对的。京剧

[code:3m8vxnuz]data _null_;
        call streaminit(12);
        array xa{5};
        do i=1 to dim(xa);
                call symputx(vname(xa[i]), rand('exponential'));
                _x =symget(vname(xa[i])); put _x=;
        end;
run;[/code:3m8vxnuz]

[code:3m8vxnuz]%macro yours;
        %do i=1 %to 5;
                %let xa&i=%sysfunc(rand(exponential));         %put &&xa&i;
        %end;
%mend yours;

%yours
;[/code:3m8vxnuz]
作者: shiyiming    时间: 2011-4-3 07:04
标题: Re: 如何把产生的各种随机数值赋给一个宏变量
最讨厌嵌套宏什么的。
作者: shiyiming    时间: 2011-4-3 09:52
标题: Re: 如何把产生的各种随机数值赋给一个宏变量
[quote="jingju11":2egwjbym]%let 语句在data step里的用法说来话长。你的第二个程序是对的。京剧

[quote="sxlion":2egwjbym]最讨厌嵌套宏什么的。[/quote:2egwjbym][/quote:2egwjbym]
多谢大侠们的回帖啊,下边还有一种我们老师给的答案,虽然方法我认为没有前边大侠们给的好,不过还是一种有效的方法:
data c;
    retain seed  0;
    do i=1 to 150;
        x1=rand('exponential');
        x2=rand('uniform');
        x3=rand('uniform');
        Z=rangam(seed,2.5);         
       output;
    end;
run;
data _null_;
        set c;
        call symputx ("xa_"||strip(put(_n_,best.)),x1);
        call symputx ("xb_"||strip(put(_n_,best.)),x2);
        call symputx ("xc_"||strip(put(_n_,best.)),x3);
        call symputx ("zz"||strip(put(_n_,best.)),Z);
run;
作者: shiyiming    时间: 2011-4-3 10:02
标题: Re: 如何把产生的各种随机数值赋给一个宏变量
本人还有一些问题,就是在产生有些随机数时,要涉及到对seed的取值,不清楚在各种情况下seed该如何取值,这是其一。
第二个就是对call symput 与call symputx的一些区别不是很清楚! 请大侠们指点迷津!!
作者: shiyiming    时间: 2011-4-6 13:18
标题: Re: 如何把产生的各种随机数值赋给一个宏变量
继续哭等,继续观望!!!
作者: shiyiming    时间: 2011-4-7 21:07
标题: Re: 如何把产生的各种随机数值赋给一个宏变量
[quote="天性爱好者":d1ms0mrg]本人还有一些问题,就是在产生有些随机数时,要涉及到对seed的取值,不清楚在各种情况下seed该如何取值,这是其一。
第二个就是对call symput 与call symputx的一些区别不是很清楚! 请大侠们指点迷津!![/quote:d1ms0mrg]


依,看来还要继续等待哦!!!
作者: shiyiming    时间: 2011-4-10 01:40
标题: Re: 如何把产生的各种随机数值赋给一个宏变量
京剧兄真是data step的高手,有八分当年data _null_ 大师的风采。
作者: shiyiming    时间: 2011-4-10 08:54
标题: Re: 如何把产生的各种随机数值赋给一个宏变量
call symputx与call symput好像没多大的区别,目前我知道的就只有消除空格的影响,前一个symputx能消除后面参数的左右空格,而symput只能消除右空格!!
如:测试代码(下)
data _null_;
set sashelp.class nobs=obs;
call symputx('m1',obs);
call symput('m2',obs);
Stop;
run;
%put &m1.;
%put &m2.;

data test&m1.;
x=1;
run;
data test&m2.;
x=1;
run;
程序运行结果test&m2.会报错,查看日志会发现会在&m2.解析后左边有很多空格。造成数据集的名字,没有达到效果。不知道大侠们还知道其它的一些区别不?

现在问题只剩下一个了,那就是如何对seed取值,有什么诀窍之类的,平时在用seed产生随机数时都是任意取的!取seed的0时是最多的,完全没根据的取值,
有哪位大侠能举例说明一下么!!!
作者: shiyiming    时间: 2011-4-10 09:21
标题: Re: 如何把产生的各种随机数值赋给一个宏变量
种子尽量取较大值
参见这篇解释:

<!-- m --><a class="postlink" href="http://www.sascommunity.org/wiki/How_the_SAS_Random_Number_Generators_Work">http://www.sascommunity.org/wiki/How_th ... ators_Work</a><!-- m -->

应该不需要翻墙
作者: shiyiming    时间: 2011-4-10 09:37
标题: Re: 如何把产生的各种随机数值赋给一个宏变量
[quote=&quot;oloolo&quot;:2bw8r3xs]种子尽量取较大值
参见这篇解释:

<!-- m --><a class="postlink" href="http://www.sascommunity.org/wiki/How_the_SAS_Random_Number_Generators_Work">http://www.sascommunity.org/wiki/How_th ... ators_Work</a><!-- m -->

应该不需要翻墙[/quote:2bw8r3xs]

谢谢oloolo了!!
确实有难度,之前没有看过这类国外版之类的文章,正在寻求翻译!!




欢迎光临 SAS中文论坛 (http://mysas.net/forum/) Powered by Discuz! X3.2