题目:
有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博客 ” ,链接:https://blog.itpub.net/26977915/viewspace-733820/
,如需转载,请注明出处,否则将追究法律责任。