SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 1393|回复: 16
打印 上一主题 下一主题

如何把产生的各种随机数值赋给一个宏变量

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2011-4-2 15:09:38 | 只看该作者

如何把产生的各种随机数值赋给一个宏变量

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

请问各位大侠有没有什么办法,让产生的各种随机数值赋给一个宏变量!!
回复 支持 反对

使用道具 举报

0

主题

0

帖子

2

积分

新手上路

Rank: 1

积分
2
沙发
发表于 2011-4-2 15:28:47 | 只看该作者

Re: 如何把产生的各种随机数值赋给一个宏变量

data _null_;
call symput("x1",rand('exponential'));
run;
%put &x1;
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2011-4-2 18:35:57 | 只看该作者

Re: 如何把产生的各种随机数值赋给一个宏变量

你为什么要加引号泥~

%let x1=%sysfunc(rand(exponential));
%put &x1;
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2011-4-2 19:05:57 | 只看该作者

Re: 如何把产生的各种随机数值赋给一个宏变量

[quote="superkuhasu":1u0uzdtk]你为什么要加引号泥~

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

那加了引号出错的原因又是什么哎?? 请大侠指教!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2011-4-2 19:06:57 | 只看该作者

Re: 如何把产生的各种随机数值赋给一个宏变量

[quote="vicky1020":ttge4yjw]data _null_;
call symput("x1",rand('exponential'));
run;
%put &x1;[/quote:ttge4yjw]

多谢大侠哈!!!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2011-4-2 21:50:21 | 只看该作者

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]
可以籍此来改变输出的精度。而这一点是至关重要的,因为此时输出的是字符类型的数字。

京剧
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
7#
 楼主| 发表于 2011-4-2 23:46:55 | 只看该作者

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;
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
8#
 楼主| 发表于 2011-4-3 00:13:58 | 只看该作者

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]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
9#
 楼主| 发表于 2011-4-3 07:04:48 | 只看该作者

Re: 如何把产生的各种随机数值赋给一个宏变量

最讨厌嵌套宏什么的。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
10#
 楼主| 发表于 2011-4-3 09:52:12 | 只看该作者

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;
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2025-6-10 14:34 , Processed in 0.070044 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表