Sas 从a-Z随机化符号

Sas 从a-Z随机化符号,sas,Sas,我需要从a-Z范围内的随机字符生成一个字符串。我怎么做 Atm,我只能建议在1-52范围内随机数字,然后用字符重新初始化数字。但这听起来很糟糕 您可以使用byte函数和随机数生成随机字符。只需循环所需次数,并将结果与callcats组合即可。byte函数从ASCII表返回相关字符。例如,您需要ASCII数字65-90(A-Z)和97-122(A-Z)。以下代码将生成6个字符的随机序列 data _null_; length z $6 y $1; do x=1 to 6; do until

我需要从
a-Z
范围内的随机字符生成一个字符串。我怎么做


Atm,我只能建议在
1-52范围内随机数字,然后用字符重新初始化数字。但这听起来很糟糕

您可以使用
byte
函数和随机数生成随机字符。只需循环所需次数,并将结果与
callcats
组合即可。
byte
函数从ASCII表返回相关字符。例如,您需要ASCII数字65-90(A-Z)和97-122(A-Z)。以下代码将生成6个字符的随机序列

data _null_;
length z $6 y $1;
do x=1 to 6;
    do until (rank(y) in (65:90,97:122)); /* ASCII characters A-Z, a-z */
    y=byte(65+floor((1+122-65)*rand("uniform"))); /* Generate random integer between 65 and 122 */
    end;
call cats(z,y); /* concatenate values */
end;
putlog z;
run;

您可以使用
byte
函数和随机数生成随机字符。只需循环所需次数,并将结果与
callcats
组合即可。
byte
函数从ASCII表返回相关字符。例如,您需要ASCII数字65-90(A-Z)和97-122(A-Z)。以下代码将生成6个字符的随机序列

data _null_;
length z $6 y $1;
do x=1 to 6;
    do until (rank(y) in (65:90,97:122)); /* ASCII characters A-Z, a-z */
    y=byte(65+floor((1+122-65)*rand("uniform"))); /* Generate random integer between 65 and 122 */
    end;
call cats(z,y); /* concatenate values */
end;
putlog z;
run;

CALL RANPERM似乎非常适合此任务

25         data shuffle(keep=a: drop=addr);
26            array a[52] $1;
27            addr = addrlong(a1);
28            call pokelong(cat(collate(65,90),collate(97,122)),addr,52);
29            put @20 a[*];
30            seed=1234567890123;
31            do n=1 to 10;
32               call ranperm(seed,of a[*]);
33               put seed= @20 a[*];
34               output;
35               end;
36            stop;
37            run;

                   A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z
seed=295748501     i U I K e d H R b E D k u N c v B M T Z G V n A s W h r q Q j F J o x X O p g t Y w z P C m S l L f a y
seed=766887342     z F v U N G M q u H P Q Z d y b X l a D f p Y w m o r V A B n J I j e g c S x R T K O L i s k C h E W t
seed=618158873     L v x k T r c m S e F w n Z K G P t q E W C h M z X p d N o H Y V i s Q u y f B J O g l U R D b I a j A
seed=632090736     J l H Y T R A p N x C v U b w K V W d X t L y E G o Q B M z I S n q k f s O F P D j a r m i c g Z h e u
seed=1911942895    t G j Z e K q H x m L F A g T h v W a y V C B M k I r J S R P s Y Q p w O D E l X U o z u N d f n i b c
seed=479260872     Y Q i d P R z S G B a D K Z X j M E b h T m c e C I n x y w o A k r U f H u l N W s v J p L q O t g V F
seed=1143672881    L X i f a u m K T g x p E M o B q Z s c t A Q I P G D z U d H S y V J F j h r e l v C b k Y W R O w N n
seed=869134054     F D U g G w A Y J o e p r b H z q d l I L M v R W h y m t S n V x T P C K B k O Q i j s c N f Z a X E u
seed=481233318     n h P j V M y S W s m F a G l q f d o O A u T I E p k z b e C X t v Q H i w c U g Z K B R N L x r D J Y
seed=1445828380    d P t o N h c R r M l n E y g F x z S a W L G p w T Q k B H e v I K i b f q X C m Y D J Z V j A U u O s

CALL RANPERM似乎非常适合此任务

25         data shuffle(keep=a: drop=addr);
26            array a[52] $1;
27            addr = addrlong(a1);
28            call pokelong(cat(collate(65,90),collate(97,122)),addr,52);
29            put @20 a[*];
30            seed=1234567890123;
31            do n=1 to 10;
32               call ranperm(seed,of a[*]);
33               put seed= @20 a[*];
34               output;
35               end;
36            stop;
37            run;

                   A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z
seed=295748501     i U I K e d H R b E D k u N c v B M T Z G V n A s W h r q Q j F J o x X O p g t Y w z P C m S l L f a y
seed=766887342     z F v U N G M q u H P Q Z d y b X l a D f p Y w m o r V A B n J I j e g c S x R T K O L i s k C h E W t
seed=618158873     L v x k T r c m S e F w n Z K G P t q E W C h M z X p d N o H Y V i s Q u y f B J O g l U R D b I a j A
seed=632090736     J l H Y T R A p N x C v U b w K V W d X t L y E G o Q B M z I S n q k f s O F P D j a r m i c g Z h e u
seed=1911942895    t G j Z e K q H x m L F A g T h v W a y V C B M k I r J S R P s Y Q p w O D E l X U o z u N d f n i b c
seed=479260872     Y Q i d P R z S G B a D K Z X j M E b h T m c e C I n x y w o A k r U f H u l N W s v J p L q O t g V F
seed=1143672881    L X i f a u m K T g x p E M o B q Z s c t A Q I P G D z U d H S y V J F j h r e l v C b k Y W R O w N n
seed=869134054     F D U g G w A Y J o e p r b H z q d l I L M v R W h y m t S n V x T P C K B k O Q i j s c N f Z a X E u
seed=481233318     n h P j V M y S W s m F a G l q f d o O A u T I E p k z b e C X t v Q H i w c U g Z K B R N L x r D J Y
seed=1445828380    d P t o N h c R r M l n E y g F x z S a W L G p w T Q k B H e v I K i b f q X C m Y D J Z V j A U u O s


标题和描述之间的关系是什么?@Marccompt,我已经修正了,先生标题和描述之间的关系是什么?@Marccompt,我修正了,先生,请您解释一下,
4行的作用是什么?第5行返回一个介于65和122之间的随机数。但是,您不希望包含数字91-96,因此第4行添加了一个额外的循环,直到返回的数字不在该范围内为止。变量y实际上存储字符值(这是
字节
返回的值),因此我必须使用
函数将其转换回ASCII数。请您解释一下,
第4行
的作用是什么?第5行返回一个介于65和122之间的随机数。但是,您不希望包含数字91-96,因此第4行添加了一个额外的循环,直到返回的数字不在该范围内为止。变量y实际上存储字符值(这是
字节
返回的值),因此我必须使用
函数将其转换回ASCII数。是否有任何特殊原因需要使用直接内存访问函数来执行此操作?看起来像是overkill.DN,您可能想解释一下
call ranperm
在这里做了什么-也就是说,它在“洗牌”字母,所以不需要替换就进行采样。@user667489我本可以使用do循环来填充数组,但正如上面提到的,这是实现相同结果的简单方法。我想我不这么认为。@Joe我认为RANPERM是不言自明的,可能值得注意的是,这并不等同于Keith的解决方案,除非你只保留每个排列的第一个字母,否则每个字母最多只能出现一次
call ranperk
可能会有帮助。是否有任何特殊原因需要使用直接内存访问功能来执行此操作?看起来像是overkill.DN,您可能想解释一下
call ranperm
在这里做了什么-也就是说,它在“洗牌”字母,所以不需要替换就进行采样。@user667489我本可以使用do循环来填充数组,但正如上面提到的,这是实现相同结果的简单方法。我想我不这么认为。@Joe我认为RANPERM是不言自明的,可能值得注意的是,这并不等同于Keith的解决方案,除非你只保留每个排列的第一个字母,否则每个字母最多只能出现一次<代码>呼叫ranperk
可能会对此有所帮助。