ITPub博客

首页 > Linux操作系统 > Linux操作系统 > SQL趣题:求硬币的概率期限。。。

SQL趣题:求硬币的概率期限。。。

原创 Linux操作系统 作者:0x0x0x 时间:2012-06-26 14:21:22 0 删除 编辑
原帖请见:
http://www.itpub.net/thread-1627528-1-1.html

题目:
有100万枚1元硬币,按以下方式投入两个钱罐(设为1号罐和2号罐)中:一开始两个罐子各投1枚。之后,如果两个罐子中分别有x,y枚硬币时,那么
下一枚硬币将以 x/(x+y)的概率落入有x枚硬币的罐子,以y/(x+y)的概率落入另一个罐子。
问题:你愿意花多少钱来买最后装有较少硬币的那个罐子呢?如果是3个罐子呢?N个罐子呢?
两个罐子的情况我用以下的SQL模拟了一下,不知道对否,反正效率好差!
N个罐子的情形,简直木法做了!
SQL> set timing on
SQL> WITH t AS
  2    (SELECT rn,jug FROM
  3      (SELECT ROWNUM rn FROM DUAL CONNECT BY ROWNUM<10000)                ----------这里我只模拟了1万块硬币,理论上应该是1百万块硬币!
  4      MODEL RETURN UPDATED ROWS
  5      DIMENSION BY (rn)
  6      MEASURES (1 jug)
  7      RULES (jug[ANY] ORDER BY rn=DECODE(cv(rn),1,1,2,2,
  8      DECODE(SIGN(dbms_random.value-COUNT(DECODE(jug,1,1,NULL))[rn  9      SELECT COUNT(DECODE(jug,1,1,NULL))/COUNT(jug) p1,
10      (1-COUNT(DECODE(jug,1,1,NULL))/COUNT(jug)) p2 FROM t
11  /
        P1         P2
---------- ----------
.559555956 .440444044
已用时间:  00: 01: 10.36
SQL>
最终的答案,我认为就是1百万乘以小的那个概率。
以上是我的解法,不过这种方法并非最好的,效率太差了!
论坛中有人给出了这样的解法,他的方法效率挺好的:
SELECT jug,10000-jug another FROM
      (SELECT 1 rn,1 jug FROM DUAL)
      MODEL RETURN UPDATED ROWS
      DIMENSION BY (rn)
      MEASURES (1 jug)
      RULES ITERATE(10000) (jug[1]=CASE WHEN dbms_random.value                                        ELSE jug[1]
                                   END)

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26977915/viewspace-733820/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2012-06-26

  • 博文量
    35
  • 访问量
    91905