楼主: liubing408
5273 10

如何从21个字母中随机选择4个组合生成新的字符? [推广有奖]

  • 0关注
  • 0粉丝

高中生

77%

还不是VIP/贵宾

-

威望
0
论坛币
40 个
通用积分
0.0053
学术水平
1 点
热心指数
0 点
信用等级
0 点
经验
351 点
帖子
28
精华
0
在线时间
12 小时
注册时间
2010-3-19
最后登录
2014-8-8

楼主
liubing408 发表于 2010-3-26 15:47:04 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
是这样的,我有2400条数据,想给每一条数据以字母命名的唯一的标识符。从  A 、B 、 C 、D 、E 、F、  H 、 K 、L 、M、 N 、P 、R 、S、 T、 U 、V 、W、 X、 Y 、Z中随机挑选3个,如果不考虑顺序,可以有1330种组合,
选择4个 可以有5985种组合,现在只能选择4个了。好像是用rannui()这个函数。可是我不知道怎么写这段程序。高手帮帮忙啊。我急用啊。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:RAN 不知道 选择 随机 字符 字母

回帖推荐

soporaeternus 发表于2楼  查看完整内容

看看行不行,和之前那个类似嘛。。。

本帖被以下文库推荐

沙发
soporaeternus 发表于 2010-3-26 16:06:27
  1. data Cde;

  2.         do Cde=1 to 26 by 1;

  3.                 Des=byte(Cde+64);

  4.                 if Des not in ("G","I","J","O","Q") then output;

  5.         end;



  6. run;

  7. proc sql;

  8.         select Des into:Des separated by '' from Cde;

  9. quit;

  10. %put &Des;

  11. data test;
  12.         do n=1 to 2400 by 1;
  13.                 output;
  14.         end;

  15. run;


  16. data result;
  17.                 length Rst $4;
  18.                 set test;

  19.         do i=1 to 4 by 1;

  20.                 if i=1 then  do;
  21.                                         All=compress("&Des");
  22.                                         Rst="";
  23.                                 end;

  24.                 length=length(All);

  25.                 x=ceil(ranuni(0)*length);

  26.                 Rst=compress(substr(All,x,1)||Rst);

  27.                 substr(All,x,1)="";

  28.                 All=compress(All);
  29.                        
  30.         end;
  31.                 keep n Rst;


  32. run;
复制代码
看看行不行,和之前那个类似嘛。。。
已有 2 人评分经验 论坛币 学术水平 收起 理由
bakoll + 3 + 3 精彩帖子
crackman + 100 + 1 精彩帖子

总评分: 经验 + 3  论坛币 + 103  学术水平 + 1   查看全部评分

Let them be hard, but never unjust

藤椅
醉_清风 发表于 2010-3-26 16:58:56
貌似以前问过一样的吧
从来不需要想起 永远也不会忘记

板凳
jingju11 发表于 2010-3-26 20:59:58
soporaeternus 发表于 2010-3-26 16:06
  1. data Cde;

  2.         do Cde=1 to 26 by 1;

  3.                 Des=byte(Cde+64);

  4.                 if Des not in ("G","I","J","O","Q") then output;

  5.         end;



  6. run;

  7. proc sql;

  8.         select Des into:Des separated by '' from Cde;

  9. quit;

  10. %put &Des;

  11. data test;
  12.         do n=1 to 2400 by 1;
  13.                 output;
  14.         end;

  15. run;


  16. data result;
  17.                 length Rst $4;
  18.                 set test;

  19.         do i=1 to 4 by 1;

  20.                 if i=1 then  do;
  21.                                         All=compress("&Des");
  22.                                         Rst="";
  23.                                 end;

  24.                 length=length(All);

  25.                 x=ceil(ranuni(0)*length);

  26.                 Rst=compress(substr(All,x,1)||Rst);

  27.                 substr(All,x,1)="";

  28.                 All=compress(All);
  29.                         
  30.         end;
  31.                 keep n Rst;


  32. run;
复制代码
看看行不行,和之前那个类似嘛。。。
我的问题和以前的一样,你怎么保证选出来的ID不重复?

报纸
soporaeternus 发表于 2010-3-26 23:36:07
  1. %MACRO T(Des,C);
  2. %let N=%length(%sysfunc(compress(&Des)));
  3. data test;
  4.         length Rst $&C;
  5.         %do i=1 %to &N %by 1;
  6.                 do i_&i=0 to 1 by 1;
  7.         %end;
  8.         Rst="";
  9.         if sum(of i_1-i_&N)=&C then do;
  10.                 %do i=1 %to &N %by 1;
  11.                         if i_&i=1 then Rst=compress(Rst||substr("&Des",&i,1));
  12.                 %end;
  13.                 output;
  14.         end;
  15.         %do i=1 %to &N %by 1;
  16.                 end;
  17.         %end;
  18.         keep Rst;
  19. run;
  20. %MEND T;
  21. %T(&Des,4);
复制代码
对不起,我没看到生成的标示需要唯一。
以上代码生成comp(21,4)的所有取法
抽样2400个......
希望有好办法
Let them be hard, but never unjust

地板
jackbt123 发表于 2010-3-27 07:24:12
Here is Macro for Combination to generate all cases by choosing R out of any list with length >= R.
Reference: http://support.sas.com/techsup/technote/ts498.html

%MACRO COMBINATION(R) / PARMBUFF; /* the PARMBUFFf option assigns the invocation parameter list to the macro variable &SYSPBUFF */

%LET M = 2;
%LET LIST = ;
%DO %WHILE (%QSCAN(&SYSPBUFF, &M, %STR(,%))) NE );
        %LET ELEMENT = "%QSCAN(&SYSPBUFF, &M, %STR(,%)))";
        %IF &M = 2 %THEN %LET LIST = &ELEMENT;
        %ELSE %LET LIST = &LIST, &ELEMENT;
        %LET M = %EVAL(&M + 1);
%END;
%LET K = %EVAL(&M - 2);

%PUT &LIST;
%PUT &R;
%PUT &K;

DATA COMBINATION;
        KEEP V1 - V&R;
        ARRAY L{&K} $ 1 (&LIST);
    DO i1 = 1 TO DIM(L);
    %DO S = 2 %TO &R;
                DO i&S = i%EVAL(&S - 1) + 1 TO DIM(L);
        %END;
                %DO S = 1 %TO &R;                 
                        V&S = L{i&S};
                %END;
                OUTPUT;
        %DO S = 1 %TO &R;                 
                END;
        %END;
RUN;

%MEND COMBINATION;

%COMBINATION(4,A,B,C,D,E,F,H,K,L,M,N,P,R,S,T,U,V,W,X,Y,Z);

7
jackbt123 发表于 2010-3-27 07:26:39

8
08liurenxing 发表于 2010-3-27 07:40:39
学习一下,顶起

9
jingju11 发表于 2010-3-27 11:17:03
soporaeternus 发表于 2010-3-26 23:36
  1. %MACRO T(Des,C);
  2. %let N=%length(%sysfunc(compress(&Des)));
  3. data test;
  4.         length Rst $&C;
  5.         %do i=1 %to &N %by 1;
  6.                 do i_&i=0 to 1 by 1;
  7.         %end;
  8.         Rst="";
  9.         if sum(of i_1-i_&N)=&C then do;
  10.                 %do i=1 %to &N %by 1;
  11.                         if i_&i=1 then Rst=compress(Rst||substr("&Des",&i,1));
  12.                 %end;
  13.                 output;
  14.         end;
  15.         %do i=1 %to &N %by 1;
  16.                 end;
  17.         %end;
  18.         keep Rst;
  19. run;
  20. %MEND T;
  21. %T(&Des,4);
复制代码
对不起,我没看到生成的标示需要唯一。
以上代码生成comp(21,4)的所有取法
抽样2400个......
希望有好办法
这个程序好。这也是我在此论坛见到的最好的程序之一。

10
xiaohangua 发表于 2010-11-21 20:02:20
学习了!!

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-19 08:41