利用SQL實現一個圖形概率問題

yangtingkun發表於2009-02-12

今天和同事聊天的時候,同事提到開發版有個SQL問題比較有意思:http://www.itpub.net/thread-1122842-1-1.html

在一個7×7的圖形內,構造一個等腰三角形的概率有多大。

 

 

說實話,用SQL實現比較困難,但是這道題居然是小學的數學題,如果不懂勾股定理,怎麼解題還真是沒有思路。不過話說回來,小學的孩子會懂得概率的含義嗎,看來只能認為出題的是個BT了。

SQL> WITH
  2  A AS (SELECT ROWNUM - 1 I FROM DUAL CONNECT BY LEVEL <= 49)
  3  SELECT COUNT(*) COUNT,
  4   SUM(
  5    CASE WHEN (ABS(D1 - D2) < 0.001 OR ABS(D1 - D3) < 0.001 OR ABS(D2 - D3) < 0.001)
  6     AND D1 + D2 - D3 > 0.001 AND D1 + D3 - D2 > 0.001 AND D2 + D3 - D1 > 0.001
  7     THEN 1 END
  8    )/COUNT(*) RATE
  9  FROM
 10  (
 11   SELECT 
 12    POWER(POWER(TRUNC(C.I/7) - TRUNC(B.I/7), 2) + POWER(MOD(C.I, 7) - MOD(B.I, 7), 2), 0.5) D1,
 13    POWER(POWER(TRUNC(C.I/7) - TRUNC(A.I/7), 2) + POWER(MOD(C.I, 7) - MOD(A.I, 7), 2), 0.5) D2,
 14    POWER(POWER(TRUNC(B.I/7) - TRUNC(A.I/7), 2) + POWER(MOD(B.I, 7) - MOD(A.I, 7), 2), 0.5) D3
 15   FROM A, A B, A C
 16   WHERE A.I < B.I
 17   AND B.I < C.I
 18  );

     COUNT       RATE
---------- ----------
     18424 .119409466

解決問題的思路很簡單,就是利用勾股定理來判斷。如果滿足任意兩邊之和大於第三邊,就滿足構成三角形的條件。

而如果任意兩條邊的長度相等,就滿足等腰三角形的條件。

最後將兩個結果相除就是所求結果。

不過Oracle在進行平方和開方的時候存在一些小的誤差,導致有些3點在一條直線的情況無法判斷出來。這種情況應該是兩邊只和等於第三邊,但是由於誤差,導致這裡的結果也是大於,因此這裡採用兩邊之和減第三邊,判斷這個結果大於一個接近0的數值。對於當前這道題,由於三個點取值都是離散的整數,所有這種近似的方法不會存在問題。這個接近0的數值與邊長相比要小几個數量級,因此不會影響比較結果,而和Oracle誤差相比又大了很多個數量級,所以可以有效的避免誤差的產生。

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-550327/,如需轉載,請註明出處,否則將追究法律責任。

相關文章