Forums
http://www.eee-learning.com/article/4357
後學看了版主所寫有關卜卦用具的文章, 有感如要起個以或然率而言, 要準確的卦, 實在不容易.
例如版主文中所言, 用現代銅板問題. 太極丸對物料及製作的工藝要求也高. 萬一太極丸的物料或製作有問題, 就直接影響到或然率.
而如果卜卦程式本身的演算法沒問題的話, 卜出來的卦應該也沒什麼問題. 未知各位前輩對用卜卦程式有什麼心得或看法?
- Log in to post comments
或然率與準確率
Wong兄:
您這問題,除了站長或程式撰寫者能回答以外,其餘人士,並無法給出一個客觀的答案。因為要評斷一個占卦程式的優劣,如同要評斷一個骰子的對稱性,如果沒有到達一定的量,少數的幾百占,不管是說好或著說不好,並沒有統計意義。
過去當我還很在乎占驗率的時候,總覺得占卜時道具與儀式,對占驗率有極大幫助,因此對電腦占卜或論命,自然容易鄙視,甚至嗤之以鼻,但現在則不然,我認為不管什麼學問,都應該與時俱進,占卜也不例外。如果撰寫程式者是一位懂易理的人,那沒有一種工具能比電腦更隨機與均衡。因此要請站長告知,進階版的程式,六七八九的機率是採哪一種?只要您認同這樣的分配機率,電腦占卜,是可以使用的。不單是卜卦,在這邊,我也看到有同好用程式解卦,雖然電腦解卦仍不完美,但跟十幾年前相比,實有天壤之別,未來一定大有可為。
占卜時,我們當考究工具的公平性,工具如果不均衡,占驗率一定受影響,不過即使工具是100%公平與均衡,卻不必然保證占驗。工具的均衡是占驗的必要但非充分條件,這是每一個占卜者在占卜前必須放在心上的。
程式機率說明
關於KHS大所問易學網卜卦程式,這裡做個說明。
我的程式都是用javascript寫的。
機率則依程式而不同。簡易法的機率就是任何一卦的機率都是1/64。
進階法裡,六爻都有自己的一個變數,每一爻的筮數機率如下:
這應該是與三錢法或是太極丸法的機率是一樣的,但與50策的大衍法是不一樣的。
為了解決這個問題,多年來也做了很多機率的研究,證實大衍法機率大有問題(主要是依春秋筮例的機率來調整)。
但從後台各卦的流量來看,機率是否就與這樣的設定吻合呢?其實差距還挺大的。
不過,這是因為干擾的因素非常多。主要可能的因素來自於可能的搜尋流量引導。因為每卦的解釋都是網路上的公開內容,任何人都可引導流量過去,因此這也實在很難從後台流量來斷定。
先前自製太極丸,曾經試驗了三顆的機率,也都不可能達到真的1:1,大概都會接近45:55至50:50的範圍之內。
簡單說,程式的機率應該是最為完美的,因為那是純數的推算。而只要有媒介介質的,那麼機率就不會完美。但這應該不致於影響到總體的占斷。影響較大的會像是分二之前到底是48策還是49策的這種差別。這種差別才會真正造成機率的重大扭曲。
小小建議
我看見站內卜卦程式是用下面的方法以 pseudo-random 取卦:
焦氏: Math.round(Math.random()*10000000000000000)%64+1
初級: Math.round(Math.random()*10000000000000000)%64+1
進階: Math.round(Math.random()*100000)%8
普遍來說, 電腦 pseudo-random 的質量 (可說是 "隨機度/感"), 是高位置 (high order bits) 的比較好. (更正2: 2016 後 web browser 的亂數產生器基本上已經修正了.) 而上述的方法, 先乘大後取餘數, 是採取了中至低的位置 (尤其 "焦氏" 和 "初級"). 此外, Math.round() 是四捨五入, 也極輕微地使機會率偏了一丁點. 我建議修改如下:
焦氏: Math.floor(Math.random()*64)+1
初級: Math.floor(Math.random()*64)+1
進階: Math.floor(Math.random()*8)
(容我大膽估計, 站長先把數字乘大, 應該是想減輕由 Math.round() 所引致的機率偏差.)
(更正 1: Math.round() 所引致的機率偏差被緊接的餘數計算修正了.)
機率疑問
若是用你的程式,先x64或x8再取整數,這樣的機率是否會更精確我是相當存疑的(純粹是因為還沒攪懂中間的算術),還望詳解。
另外,其精確度的提高,有多高這也是我想要知道的地方。甚至有沒有可能機率分配反而變差了?(我自己的大致推理感覺好像是變差了,雖然沒有到不能接受的地步)
先說 "焦氏" 和 "初級" 的算法
Javascript 裡面的數值, 是用 IEEE-754 的 binary64 格式儲存, 即是 Java 的 double. 它用了 1 bit 放正負號, 11 bits 放 "指數", 52 bits 去放 "有效數", 折算成十進數就是 15 至16 個有效數字 (理論值是 15.95). 大家可以想像, "987,654.321" 這個數字是儲成 "+1 * 9.87654321 * 10^6", 正負號是 "+1", 指數是 "6", 有效數是 "9.87654321". 不過電腦不是用十進數, 全是用二進數的.
Math.random(), 基本上是由(僞)亂數產生器, 拿出一定數量的 "(僞)亂" bits (0 或 1), "製成" 一個等於或大於 0 又小於 1 的小數. 數學上我們寫成 [0, 1)
Math.random() 是 [0, 1)
那麼 10000000000000000 * Math.random() 是 [0.0, 10000000000000000.0), 亦即是 [0.0, 0.5) + [0.5, 9999999999999999.5) + [9999999999999999.5, 10000000000000000.0)
再來一個 Math.round() 的四捨五入, 便得出 [0, 10000000000000000], 共有 10000000000000001 個數值, 當中 0 和 10000000000000000 的出現率比其他數字少一半. 可幸接著就 "% 64", 所以 0 至 63 的出現率理論上是相同的.
問題是 10000000000000000 這個數字太大了.
10,000,000,000,000,000 的二進制有 54 個位, 但 Math.random() 只有 53 bits 的 "隨機度" (因為限制了 0 至 1), 所以 10000000000000000 乘 Math.random() 所得的積數, 最低位置的 bits 其實是由前面的 bits 衍生出來的. (如果使用特定的質數, 是可以把 Math.random() "隨機度" "適當地" "分散" 到積數的高低不同位置, 但背後的數學太艱深, 我不會.)
此外, Javascript 裡面的數值只有 15~16 個有效數字, 而可能的出現的積數, 十中有九, 整數部份都需要 16 個有效數字. 所以相乘數值後的個位甚至十位都有機會不準確, 而且有一些數值是直接丟失了.
最後一步, 用 "% 64" 計出餘數, 只取用了積數最後的 6 個 bits.
所以無論是 0 ~ 63 的出現率, 又或者是 "隨機度", 都有問題.
那 "進階" 的 "* 100000" 又如何呢? 現在很晚了, 請恕我明天才可以繼續.
再談 "進階" 的算法
簡單來說, "Math.round(Math.random()*100000)%8" 沒有問題, 但可以簡化.
隨機度方面, 是先取最高約 17 bits 的亂數 (100,000 ~= 2^16.61), 再取這 17 bits 的最低 3 bits (8 = 2^3). 而因為 2016 年後差不多所有瀏覽器都改用了比較高質素的(偽)亂數產生器, 所以這個方法是可行的.
分佈方面, Math.round() 是有問題. 但因為 100000 可以被 8 整除, 所以又修正了, 變成沒有問題.
但為甚麼要寫得那麼複雜呢?
我的建議, 只是引用了 Mozilla (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random) 的例子.
「偽」程式員寫的
我算是「偽」程式設計師,找不到人幫忙寫,所以只好自己上陣。
為了寫這程式而邊學邊寫硬湊出來的。
現在你若叫我寫,我大概也是得再重新邊Google邊拼湊。
這個機率問題我會再找時間慢慢將它換掉。另有一問題。
焦氏易林的值日卦的程式裡,原本要能夠用程式決定每年二十四節氣的分界點,再去計算出每天的值日卦。
我Google很久雖有找到範例程式,但弄不出來。
後來只好用笨方法,每年去查香港天文台的觀測時間,以該時間為每個月做一個值日卦的計算檔案。
所以得年年上傳這些檔。不知有沒有漂亮的寫法不用年年上傳檔案?
把進階版改了一點點
新年有一點空閒時間, 把進階版改了一點點, 加了大衍揲卦法 (之前的是三錢法). Jack 大可以看看是否合用:
https://drive.google.com/open?id=0BwwlupmDRV3QdTlWNVhfZHoyczQ
程式裡好像有三種方法?
如題。程式裡好像設定了三種方法。
但不知產生卦象時用的是那一種?(我是偏愛用三錢法的機率)
另外,有個error.jpg在呈現錯誤訊息是怎麼一回事?是不是會有卦象產生錯誤的機率?如果是的話,是否可以將error的情況排除?
再修改了一點點
1) 如果用家以 "http://www.eee-learning.com/eeeApp/eee.html" 進入, 程式會把產生的巫數放在網址, 例如 "http://www.eee-learning.com/eeeApp/eee.html?method=sanqian&random=uniform&numbers=898777"
2) 在程式第 14 行可以指定巫法和亂數分佈, 合共有 (1+1+1+2*3) = 9 種方法. 我記得站裡有文章說進階版是使用 "大衍揲卦", 不過現在跟 Jack 大意思, 預設為三錢法.
2b) 如果想看到巫數/變爻分佈, 可以在 address 加入 "&runstats=true".
3) "error.jpg" 是例外情況, 正常情況不會觸發, 不需要理會它.
這樣臉書分享是不是就可以保留結果?
「程式會把產生的巫數放在網址」這樣臉書分享時是不是就可以保留網址?
如果是的話,只要放入臉書分享的程式碼就零了?
如果是的話就太好了
可以保留網址, 另有更新
剛剛又更新了:
1) 加了 "simple" (必無變爻) 和 "gaodao" (必一變爻).
2) 更正了三個變爻時的描述.
3) 加了高島(必一變爻)時的描述.
4) 巫法, 亂數法和巫數都會在網址中出現, 方便貼連結用.
值得期待
Henry兄:
犧牲了過年假期,您就把程式寫畢,結果真令人期待,感恩,感恩。
我只是拿 Jack 大的程式小修小補 ....
完全談不上 "寫畢".
站長不要太謙虛
這個易學平台一字一句都是站長的心血結晶 大家有目共睹.
"(僞)亂數產生器" 只是 "pseudo-random number generator" 的翻譯, 沒有其他意思, 若有冒犯, 請你原諒.
此外, 我發現 2017 和 2018 的資料有 xml 格式.
http://www.weather.gov.hk/gts/astron2017/24SolarTerms_2017.xml
http://www.weather.gov.hk/gts/astron2018/24SolarTerms_2018.xml
排節氣問題
1) 是不是由立春時間 "2016/02/04 17:46:02.659" 開始排 "小過"?
2) "驚蟄 和 "春分" 相䧚不足 30 天, 是不是用 6:6:6:6:6:1 的比例排入 "需, 隨, 晉, 解, 大壯"?
春分當天震值一日
1. 是的。
2. 春分當天震卦值一日。其餘以其他五卦順序均分,應該大致是
6:6:3:1:3:6:6。但震卦吃掉一日會讓後面的分布變形
問題: 排值日卦的定位點
一年分 364 份, 一"季"有 61 份; 春分, 夏至, 秋分和冬至各佔一份(約一天), 由天文網站得知開始時間, 其他 60 卦也可以排上去了. 是不是這樣?
但這樣小過又不一定由立春時間開始了.....
請參考
六十卦每卦直六日,共直三百六十日。餘四卦各寄直一日。
立春 雨水 三十日五卦,每卦直六日
小過 蒙 益 漸 泰
驚蟄 春分 春分震卦直一日
需 隨 晉 解 大壯
清明 穀雨
豫 訟 蠱 革 夬
立夏 小滿
旅 師 比 小畜 乾
芒種 夏至 夏至離卦直一日
大有 家人 井 咸 姤
小暑 大暑
鼎 豐 渙 履 遯
立秋 處暑
恒 節 同人 損 否
白露 秋分 秋分兌卦直一日
巽 萃 大畜 賁 觀
寒露 霜降
歸妹 無妄 明夷 困 剝
立冬 小雪
艮 既濟 噬嗑 大過 坤
大雪 冬至 冬至坎卦直一日
未濟 蹇 頤 中孚 復
從大雪後將坎卦入數斷。從立冬後四十五日係王相不斷。
小寒 大寒
屯 謙 睽 升 臨
每兩節氣共三十日,管五卦,逐日終而復始排定。一卦相次管六日。凡卜,看本日得何卦,便於本日卦內尋所卜得卦看凶吉。
按:四正卦分值二分二至各一日。震春分,離夏至,兌秋分,坎冬至。
其餘60卦的值日,應該以節氣交換時間做為開始,直至下一節氣結束,再由五卦均分,值日時間大約是一卦六日。有時會略多,有時會略少。
例如,春分至雨水是小過、蒙、益、漸、泰五卦值日。當以春分開始的時間,至雨水結束時間,這期間的時間均分給小過、蒙、益、漸、泰五卦。
試排 2016 值日卦表 .... 這樣對嗎?
看 spreadsheet 比較好: https://drive.google.com/open?id=1CEXbjoR26HlRLkonZOu6J4lbaX2Z5HpFxuC4Dh5slrQ
是的
就是這樣
問站長: 四正卦前後的兩個排法
方法一: 把 "驚蟄至春分" 和 "春分至清明" 分開看, 兩段時間分別以 6:6:3 和 1:3:6:6 分拆; 所以需/隨佔 6.01 日, 解/大壯 佔 5.69 日, 晉卦兩段合共 5.85 日. 這應該合乎 Jack 大所說: "其餘以其他五卦順序均分,應該大致是 6:6:3:1:3:6:6。但震卦吃掉一日會讓後面的分布變形".
方法二: 把 "驚蟄至清明" 一體看, 以 6:6:k:1:(6-k):6:6 分拆; 春分開始時間依天文臺數據, 排在晉卦中間, 所以晉卦是前段 3.34 日 (比例是 k), 後段 2.50 日 (比例是 6-k), 共 5.84 日. 好處是保持 需/隨/晉/解/大壯 的日數相同.
方法二是否比較好?
贊同第二個
依書,應該是第一種,但的確這有問題。
依理,可能是第二種比較好。
焦氏易林的前兩日才終於弄好上傳了。所以程式若要修改,記得提醒我再換。
其他的程式,要再找時間測試之後才能夠上線。
感謝亨利大幫忙!!
只是略盡綿力
相比站長的大貢獻, 我算得上甚麼?
第三種值日卦排法?
方法3, 是整年看, 將 360 度平分 364 份. 震離兌坎各得 1 份, 其餘 60 卦各得 6 份.
這樣 60 卦的角闊會相等, 不會因四正卦而不同. 這也大約合乎 "每兩節氣共三十日, 管五卦" 這個設定, 有四正卦的四對節氣多管了約 0.66 度, 其餘八對節氣就少管了約 0.33 度.
不了解
對於天文曆法不是很了解。
最準的其實還是依天文台的預測。用這種簡單的數學公式之後與實際的狀況差多遠,這是要考慮的。
因為地球並不是一個正球形。
實際相差
現在用 wiki 上的公式, 並不太差. wiki 上說直至 2050 年只有 0.01 度以內的誤差, 即大約 15 分鐘.
相同時區中, 不同經度的地方裡, 節氣交替時間本來就不同; 網站程式為了方便用家, 只使用電腦時間,這已經是一個約數.
而香港天文臺節氣表所標的是香港時間, 如果轉換成真太陽時間, 比較 2017 和 2018 的節氣時間, wiki 公式只快了兩三分鐘. 好像還不錯呢.
問站長: 用"黃經"的度數去找出節氣和值日卦, 可以嗎?
在 wiki 找到: https://zh.wikipedia.org/wiki/%E5%A4%AA%E9%99%BD%E4%BD%8D%E7%BD%AE
用黃經找出節氣和值日卦, 實在容易很多. 而 wiki 中的近似法, 在 1950 年至 2050 年的精確度可以達到 0.01 度. 不知 Jack 大覺得可不可以接受?
不是本來就是要這樣?
我是因為寫不出來
只好用很笨的方法每年到香港天文台去找
還有
另一個程式已定下來了嗎?
若是的話我找時間來套用
試用沒問題就可上傳
回站長: 另一個也寫好了
有三個檔案在 https://drive.google.com/open?id=0BwwlupmDRV3QeTREZjRRc0NhRUU
1) 進階版占卜
除了要用 "eee-common.js" 和 "eee-advanced.js" 取代原本的 "eeemin.js", 原本的 eee.html 基本上只需要改呼叫方法 (可參考 eee-advanced.js 和 eee_new.html). 新程式會在 URL 加上 method, random 和 numbers 三個參數, 讓人可以把占卜結果放上討論區.
占法 (method) 預設是 sanqian (三錢法), 另外有 大衍/49蓍 (dayan49), 大衍/50蓍 (dayan50), 簡易/無變爻 (simple) 和 必一變爻 (gaodao).
2) 焦氏易林
新的 "eee-common.js" 和 "eee-yilin.js" 取代原本的 "duty.js". 另外 1.html ~ 64.html 完全由新的 "lot_result_new.html" 取代, 但 1.js ~ 64.js 就要保留 (其實是我懶得動它們). 新程式會在 URL 加上 duty 和 gua 兩個參數, 讓人可以把占卜結果放上討論區.
現在用了 wiki 裡的近似式計算當日的黃經度數, 從而得出節氣和值日卦, 應該可用至 2050 年不需修改. 不過在春分, 夏至, 秋分, 冬至四大節氣前後, 值日卦的編排方法可能和站長不同, 請站長看看是否妥當.
感謝,盡快找時間做
太感謝了!
我得盡快擠出時間來做這件事。
隨時有問題會問你。
給站長: 原來忘了簡單版
更新了: https://drive.google.com/open?id=0BwwlupmDRV3QeTREZjRRc0NhRUU
收到
因為近期還有很多事在忙
要再等一些時候才有空來細看與重傳
在此先謝過
上傳了 v.1.2.0
https://drive.google.com/drive/folders/0BwwlupmDRV3QSEhKY0xqanN1d00
大衍之數6,7,8,9比率
我看書上大衍之數6,7,8,9比率為1/16,5/16,7/16,3/16
陰比陽較不容易變 一旦變 陰變的能量比陽變的能量強
49蓍概率
但是49蓍(大衍之數五十,其用四十有九)的筮數比例應該是1:5:7:3;用48蓍才是1:3:3:1
影響大衍機率的因素
影響大衍揲卦機率的因素有兩個: 其一是開始蓍數, 是 48 還是 49? 這個大家都應該很熟悉; 其二是 "分二" 時所採納的機率分佈, 這個站長大人在三年前亦一同指出 (http://www.eee-learning.com/article/3368), 只是大家比較少討論. 事實上, 如果揲卦者是用平均隨機的方法去 "分二", 就算是由48蓍開始, 巫數 6/7/8/9 的機率會是 1617:5448:6030:2200, 和三錢法不同.

當時我也和站長討論過, "分二"的機率應該用平均分佈, 還是二項分佈. 站長的結論是應該根據字面解釋, 採用平均分佈.
所以我剛剛把程式改回去了.
一變爻的頁面
前陣子曾經有三度去弄哪程式。
一變爻的頁面一直沒弄出來。
太久沒稿Javascript了,程式碼一時之間看不懂。
可以的話Henry大也幫忙把那頁面做出來。近來事情太忙,沒法挪出很多時間把這事一次做完。
拖了這麼久,實在不好意思。
目前以新程式碼上線的只有焦氏易林。
eee-advanced.js 在幾個月前已經加了 "必一變爻"
就是 "eee_new.html?method=yibian"
https://drive.google.com/drive/folders/0BwwlupmDRV3QSEhKY0xqanN1d00
v1.3.0 - 初試清華簡筮法
https://drive.google.com/drive/folders/0BwwlupmDRV3QS2l2NVEtbmhTaDQ?usp=sharing
循序漸進,一爻變
站長:
弟想建議再增加一隻一爻變的程式進入網站之中,
如果真有心習易者,一爻變可說是中階的版本,除了解卦的方法有共通性外,學者可體會易經中的易理與文句,這方是學易最有價值的部分。
焦氏易林,弟曾經研究數年,本想是否可藉此釐清多爻變的占解法,多年下來,除了歸納出論卦以之卦為主外,其餘一無所知,研究尚秉和的註解亦然,他可以把卦象說得無懈可擊,但卻忽視最基本的論卦方向與易例,這有可能是弟沒有人指導,自己瞎耗所致。萬般沮喪下,最終只能自我解嘲,焦氏易林偏向籤詩系統,毫無邏輯可言,與易經不同,雖然用之占卜亦有所中,然卻遠不及易經有益,邏輯也不如納甲,故與其花時間研究,不如拿那些時間研究易經或納甲。
以上為個人偏見,網站上如有能通曉焦氏易林者,尚望能指導一二。
一爻變程式納入計畫
如題。先前倒沒想過。
記得學生時代習易,我們常用的就是一枚五元加五枚一元銅板。當初的考慮也是為了練習爻象。
這個建議真的很好。
至於焦氏易林,個人認為尚秉和的方向是錯的。他把易林當做是「逸象」之寶庫,以象來解是不通的。
觀《漢書》所載:「以候司先知姦邪,盜賊不得發。」「其說長於災變,分六十四卦,更直日用事,以風雨寒溫為候,各有占驗,房用之尤精。」占侯是焦贛所長,《易林》背後的一些邏輯原則聽說是寫在未傳世的《易林變占》裡,但在此書重新面世前無從驗證。倒是占侯的素材,在易林中所用甚多。
個人認為,在易林背後邏輯被找到之前,關於占侯還有典故的研究是一個可行的方向,不盡然可以解開什麼謎團,但是這當中或有可與周易相驗證者。
高島吞象?
高島吞象好像分三次取下卦, 上卦 和 動爻. 三次都是用 49 枝竹籤開始, 隨意分兩份, 只算其中一份. 取下卦和上卦是拿 8 的餘數, 取動爻就拿 6 的餘數.
那是不是以卦辭為背景, 再用爻辭去解?
兩個變數即可
高島吞象的略筮法其實用的是梅花易的先天數起卦法。
設計程式只要把機率原理控制好即可。不需仿效梅花易。
我認為只要設定成兩個變數:1. 取本卦的機率為1/64,然後對應到1-64卦。2. 取變爻。機率控制在1/6,初爻,2爻,3爻至上爻的機率皆為1/6。
最後呈現的有兩個資訊:1. 卦辭(含十翼解釋)。2. 爻辭(含十翼解釋)。
最後並提供詳讀周易今解的連結。到時後周易今解裡,我會再加anchor,讓每個卜卦結果都能夠連到每一個爻辭的解釋。
可以試試這樣
var v_rnd = Math.random() * 64;
var v_gua = Math.floor(v_rnd) + 1; /* 1 to 64 */
var v_chg = Math.floor((v_rnd + 1 - v_gua) * 6) + 1; /* 1 to 6 */
又或者
var v_gua = Math.floor(Math.random() * 64) + 1; /* 1 to 64 */
var v_chg = Math.floor(Math.random() * 6) + 1; /* 1 to 6 */
又又或者
var v_rnd = Math.random() * 64 * 6; /* 0 to 383 */
var v_gua = Math.floor(v_rnd / 6) + 1; /* 1 to 64 */
var v_chg = (Math.floor(v_rnd % 6)) + 1; /* 1 to 6; wrong to use "Math.floor(v_rnd / 64) + 1" */
又有小建議
站長想不想小改一下占卦網頁, 方便用家張貼連結?
例如 "http://www.eee-learning.com/eeeApp/eee.html?gua=666999" 就是否之泰.
如果覺得可行, 我可以嘗試幫助.
盡量改吧!
可以把程式功能改進的話求之不得。
我是自己沒能力改,
若肯幫忙,求之不得。改好寄給我我上傳。這麼好的事,這輩子沒見過。