Sas 使用串联生成随机字符串

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将在第一次

我想生成一个长度为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将在第一次看到使用的变量时定义它。在你的情况下,在这份声明中

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个位置的变量中。