Sas 使用串联生成随机字符串
我想生成一个长度为10的随机字符串,但我不明白为什么我的代码不起作用:Sas 使用串联生成随机字符串,sas,Sas,我想生成一个长度为10的随机字符串,但我不明白为什么我的代码不起作用: data b; s=byte(0); do j=1 to 10; z=byte(97+floor(26*ranuni(0))); s=cat(s,z); end; run; 当我逐行运行此代码时,我发现问题在于: s=cat(s,z); 它不会改变变量s。这是为什么?如何修复它?很可能是因为您创建的变量只有一个字符长。SAS将在第一次
data b;
s=byte(0);
do j=1 to 10;
z=byte(97+floor(26*ranuni(0)));
s=cat(s,z);
end;
run;
当我逐行运行此代码时,我发现问题在于:
s=cat(s,z);
它不会改变变量s。这是为什么?如何修复它?很可能是因为您创建的变量只有一个字符长。SAS将在第一次看到使用的变量时定义它。在你的情况下,在这份声明中
s=byte(0);
由于编译器知道BYTE()
函数返回长度为1的字符串,因此它将S定义为长度为1的字符变量。还有,为什么要在字符变量中存储二进制零
您需要使用CAT()
函数,而不是CAT()
函数。否则S将永远不会更改,因为没有空间在其末尾添加更多字符
试着这样做:
data b;
length s $10 ;
do j=1 to 10;
z=byte(97+floor(26*ranuni(0)));
s=cats(s,z);
end;
run;
汤姆提出的解决方案似乎对我不起作用——我最后的
s
全是空白。以下备选方案的行为符合预期:
data b;
length s s2 s3 $10 z $1;
do j=1 to 10;
z=byte(97+floor(26*ranuni(0)));
s=cat(s,z); *original approach - doesn't seem to work;
call cats(s2,z); * Alternative 1;
substr(s3,j) = z; * Alternative 2;
end;
run;
即使使用
length
语句,这似乎仍然不起作用。我不知道为什么,但我建议了两种选择。您需要使用CATS()
而不是CAT()
。Cat不会修剪参数,因此新字符最终位于第11个位置,并且没有空间将其存储回只有10个位置的变量中。