|
|
SQL 是这么写的。
WITH T AS (
SELECT 1 BOX, 1 N FROM DUAL UNION ALL
SELECT 1 BOX, 2 N FROM DUAL UNION ALL
SELECT 1 BOX, 3 N FROM DUAL UNION ALL
SELECT 2 BOX, 1 N FROM DUAL UNION ALL
SELECT 2 BOX, 2 N FROM DUAL UNION ALL
SELECT 2 BOX, 3 N FROM DUAL UNION ALL
SELECT 2 BOX, 4 N FROM DUAL UNION ALL
SELECT 3 BOX, 1 N FROM DUAL UNION ALL
SELECT 3 BOX, 2 N FROM DUAL UNION ALL
SELECT 3 BOX, 3 N FROM DUAL UNION ALL
SELECT 3 BOX, 4 N FROM DUAL UNION ALL
SELECT 3 BOX, 5 N FROM DUAL
)
, T1 AS ( -- 所有 抽 2个的结果。
SELECT T.BOX, SYS_CONNECT_BY_PATH(T.N , ',') STR
FROM T
WHERE LEVEL = 2
CONNECT BY LEVEL <= 2 AND T.BOX = PRIOR T.BOX
AND ( T.N > PRIOR T.N)
)
SELECT SUM(T3.PROB)/COUNT(*) PROB
FROM (
SELECT DISTINCT T2.BOX
,SUM(T2.CNT3)OVER(PARTITION BY T2.BOX)/SUM(T2.CNT4)OVER(PARTITION BY T2.BOX) PROB -- 每个盒子的概率
FROM (
SELECT T1.BOX , T1.STR
,CASE WHEN INSTR(T1.STR,4) > 0 THEN 1 ELSE 0 END CNT4 -- 有 4 的
,CASE WHEN INSTR(T1.STR,3) > 0 THEN 1 ELSE 0 END CNT3 -- 4 中有 3 的
FROM T1
WHERE INSTR(T1.STR,4) > 0 -- 先取了 4
) T2
) T3
/
PROB
----------
0.29166666
SQL 写出来是有点麻烦, 好处是我再添加一个盒子(例如,有 3,4,5,6 卡片的盒子), 也可以马上求出概率。
WITH T AS (
SELECT 1 BOX, 1 N FROM DUAL UNION ALL
SELECT 1 BOX, 2 N FROM DUAL UNION ALL
SELECT 1 BOX, 3 N FROM DUAL UNION ALL
SELECT 2 BOX, 1 N FROM DUAL UNION ALL
SELECT 2 BOX, 2 N FROM DUAL UNION ALL
SELECT 2 BOX, 3 N FROM DUAL UNION ALL
SELECT 2 BOX, 4 N FROM DUAL UNION ALL
SELECT 3 BOX, 1 N FROM DUAL UNION ALL
SELECT 3 BOX, 2 N FROM DUAL UNION ALL
SELECT 3 BOX, 3 N FROM DUAL UNION ALL
SELECT 3 BOX, 4 N FROM DUAL UNION ALL
SELECT 3 BOX, 5 N FROM DUAL UNION ALL
SELECT 4 BOX, 3 N FROM DUAL UNION ALL
SELECT 4 BOX, 4 N FROM DUAL UNION ALL
SELECT 4 BOX, 5 N FROM DUAL UNION ALL
SELECT 4 BOX, 6 N FROM DUAL
)
, T1 AS ( -- 所有 抽 2个的结果。
SELECT T.BOX, SYS_CONNECT_BY_PATH(T.N , ',') STR
FROM T
WHERE LEVEL = 2
CONNECT BY LEVEL <= 2 AND T.BOX = PRIOR T.BOX
AND ( T.N > PRIOR T.N)
)
SELECT SUM(T3.PROB)/COUNT(*) PROB
FROM (
SELECT DISTINCT T2.BOX
,SUM(T2.CNT3)OVER(PARTITION BY T2.BOX)/SUM(T2.CNT4)OVER(PARTITION BY T2.BOX) PROB -- 每个盒子的概率
FROM (
SELECT T1.BOX , T1.STR
,CASE WHEN INSTR(T1.STR,4) > 0 THEN 1 ELSE 0 END CNT4 -- 有 4 的
,CASE WHEN INSTR(T1.STR,3) > 0 THEN 1 ELSE 0 END CNT3 -- 4 中有 3 的
FROM T1
WHERE INSTR(T1.STR,4) > 0 -- 先取了 4
) T2
) T3
/
PROB
----------
0.30555555 |
|