楼主: 6203479170
3356 18

大家有兴趣都来看看怎么编写这个程序 [推广有奖]

11
上山路 发表于 2010-8-3 21:03:41
初学SAS,看来还是要努力啊

12
jingju11 发表于 2010-8-3 21:04:05
6203479170 发表于 2010-8-2 21:01
这是02年数学建模大赛的B题:
“传统型”采用“106+1方案:先从60~9号球中摇出6个基本号码,每组摇出一个,然后从0~4号球中摇出一个特别号码,构成中奖号码。投注者从0~9十个号码中任选6个基本号码(可重复),从0~4中选一个特别号码,构成一注,根据单注号码与中奖号码相符的个数多少及顺序确定中奖等级。以中奖号码“abcdef+g”为例说明中奖等级,如表一(X表示未选中的号码)
                                表一
  
  

10

6+1
6+1/10


                              特别号码
  
一等奖
abcdef g7中(6+1
二等奖
abcdef  7中(6
三等奖
abcdeX
Xbcdef
7中(5
四等奖
abcdXX
XbcdeX
XXcdef
7中(4
五等奖
abcXXX
XbcdXX
XXcdeX
XXXdef
7中(3
六等奖
abXXXX
XbcXXX
XXcdXX
XXXdeX
XXXXef
7中(2




我现在已经生成了100万注随机的彩票号码,并生成本期的中奖号码(4,3,4,5,1,8,0)其中0为特别号码,那如何编写程序统计各等奖的中奖数呢?
下面是生成随机彩票号码的代码:
  1. data arr(drop=i);
  2. do i= 1 to 1000000;
  3. num1=int(0+9*uniform(0));
  4. num2=int(0+9*uniform(0));
  5. num3=int(0+9*uniform(0));
  6. num4=int(0+9*uniform(0));
  7. num5=int(0+9*uniform(0));
  8. num6=int(0+5*uniform(0));
  9. output;
  10. end;
  11. run;
复制代码
你的随机数的产生的方法有问题。也就是说,除非你不需要数字9.

13
jingju11 发表于 2010-8-3 21:23:59
The FREQ Procedure
                                                       Cumulative    Cumulative
                     prize    Frequency     Percent     Frequency      Percent
                  -------------------------------------------------------------
                  no prize      981101         .               .          .
                         2           1        0.01             1         0.01
                         3          11        0.06            12         0.06
                         4         178        0.94           190         1.01
                         5        1682        8.90          1872         9.91
                         6       17027       90.09         18899       100.00

14
marloneusa 发表于 2010-8-4 03:57:21
13# jingju11

我认为这个中将概率远低于你的数据。 你的procedure计算的是任意两个(或多个), 但这里好像是爱着。

15
jingju11 发表于 2010-8-4 04:41:27
marloneusa 发表于 2010-8-4 03:57
13# jingju11

我认为这个中将概率远低于你的数据。 你的procedure计算的是任意两个(或多个), 但这里好像是爱着。
你敢肯定吗?

  • data have;
  •     set arr;
  •     array c{6} _temporary_ (4,3,4,5,1,8);
  •     array num{6}; _n = 0;
  •     do i = 1 to 6;
  •       _n + (c(i) = num(i));*如果匹配,加1;
  •       if num(i) ^= c(i) then do;
  •         p = max(p, _n);  *如果不同,读入较大的P;
  • _n = 0;×把指针返回0, 也就是,如果不和中奖号匹配,那么重新计算,但是此时已匹配的个数已经记录下来作为p;
  •       end;
  •     end;
  • p =max(p, _n);
  •     if p >= 2 then prize = 8-p;
  •     if p = 6 then if num7 = 0 then prize = 1;
  •   run;
但是这个问题有个模糊的地方,如果在六位数里,%%%*%%, 其中%为匹配,*为不匹配。这个时候算几等奖?我算做匹配三个,也就是五等奖,虽然它也符合六等奖的条件。

16
marloneusa 发表于 2010-8-4 04:46:10
jingju11 发表于 2010-8-4 04:41
marloneusa 发表于 2010-8-4 03:57
13# jingju11

我认为这个中将概率远低于你的数据。 你的procedure计算的是任意两个(或多个), 但这里好像是爱着。
你敢肯定吗?

  • data have;
  •     set arr;
  •     array c{6} _temporary_ (4,3,4,5,1,8);
  •     array num{6}; _n = 0;
  •     do i = 1 to 6;
  •       _n + (c(i) = num(i));*如果匹配,加1;
  • p = _n;*转给P;
  •       if num(i) ^= c(i) then do;
  •         p = max(p, _n);  *如果不同,读入较大的P;
  • _n = 0;×把指针返回0, 也就是,如果不和中奖号匹配,那么重新计算,但是此时已匹配的个数已经记录下来作为p;
  •       end;
  •     end;
  •     if p >= 2 then prize = 8-p;
  •     if p = 6 then if num7 = 0 then prize = 1;
  •   run;
但是这个问题有个模糊的地方,如果在六位数里,%%%*%%, 其中%为匹配,*为不匹配。这个时候算几等奖?我算做匹配三个,也就是五等奖,虽然它也符合六等奖的条件。
我借用你的程序:

17
jingju11 发表于 2010-8-4 04:46:55
15# jingju11

所以我认为,原题中的X并非是不匹配,而应该理解为即使匹配也不算数的。比如说 abcdXX, 其中的第一个X为不匹配,第二X为即使匹配也不算数的,因为相邻的,也就是前面的X,不匹配。这是我的理解。

18
jingju11 发表于 2010-8-4 04:52:48
没有什么。其实。连续性的匹配反而使得程序简单一些。因为这成为一个规律了。

19
marloneusa 发表于 2010-8-4 04:55:45
18# jingju11
you are right.

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-30 08:04