從別人的網誌看到一篇做 benchmarking 的論文:A Comparison of Programming Languages in Economics,其中有些令人驚奇的結果。
比較不同程式語言的執行效率,往往引起極大爭議。一來,作比較時,實際上比較的不單單是語言本身,還牽涉了 compiler 或者 interpreter,以及程式庫。二來,各種語言均有其獨特的 features。如何用不同語言來實作同一個算則才算公平,並無定論。幾年前 Google 有人寫了篇 Loop Recognition in C++/Java/Go/Scala,對所涉各種語言,都找來熟悉該語言的工程師,先用最自然的寫法來實作同一個算則,然後再優化程式。照道理這樣做已經很公道,可是還是有工程師事後表示,若早知程式是用來做 benchmarking 的話,寫法就會不同云云。可見無論是再公平的程序,亦說服不了所有人。
三來,許多時於網上見到的都是 micro-benchmarks,它們實作的,往往都是生安白造兼且過份簡單的算則,而非來自現實問題、難度適中的算則。今次這篇論文,和前述 Google 工程師所用的算則,皆有現實背景,既不太難,亦不太易,很適合 benchmarking 用。
我自己寫的程式通常都是做科學計算,用得較多的語言中,我最熟悉的是 Matlab 和 C++,其次是 Python 和 Java,再而是 R。印象中,若計算以矩陣為主(我指的是「矩陣」matrix,不是「陣列」array),則前四種語言的表現皆差不多一樣,原因是除了 C++(但 C++ 也可以)外,Matlab, Python 或 Java 基本上都只是呼叫 BLAS 程式庫。若程式的瓶頸並非矩陣計算,則各種語言分別很大。通常若執行一個 C++ 程式要花一個時間單位,那麼 Java 就要大約 2-3 倍時間,Matlab 不用 Mex 則 6-10倍,而 Python 則時快時慢,但粗略地說,和 Matlab 同級。R 則慢過蝸牛,若講求速度的話,完全不用考慮。
那今次這篇 benchmarking 論文的結果又如何?答案是仍是 C++ 最快。各實作程式所花的時間(以 C++ 為 1.0)如下:
C++ (1.00) < Fortran (1.07) < Matlab, Mex (1.29) < Python/Numba (1.57) < Java (2.10) < Julia (2.70) < Mathematica (3.83) < Pypy (45.16) < CPython (155.31)。
以 C++, Matlab 和 R 來說,結果和我的經驗相符。然而,Julia 和 Python 的表現卻令我意外。如本網誌舊文所說,Julia 這種語法和 Matlab 有點相似的新語言可視為 "a general purpose programming language with a bias towards
scientific computing"。其設計者曾於公式網站上,吹噓 Julia 有接近 C++ 的速度,然而網站上的 benchmarks,都不是來自現實問題。因此,今次 Julia 的超卓表現,應有助其宣傳攻勢。
Python 則既慢得意外,也快得意外。PyPy 和 CPython 皆比 C++ 慢了接近兩個數量級,實在始料不及。與此同時,一個我以前未聽過的 Python package,叫 Numba,卻做出 1.57 這個難以置信的結果。若其他範疇的 Python/Numba 程式皆有此表現,何止 Julia 活不了,相信連 Java 及 C++ 皆可殺掉。
不過話說回來,這個 benchmark 未必公正。從它的源程式所見,瓶頸位似乎是二維陣列的 array access。然而用各語言實作時,作者似乎一律假設二維陣列為 column-major 的。這樣就對 Fortran, Matlab 和 Julia 有利,卻不利使用 row-major convention 的 C++ 與 Python 了。無論如何,benchmark 只能作參考,不能一概而論,但今次 Julia 和 Python/Numba 的表現均相當優秀,值得關注。
2014年6月21日星期六
2014年2月12日星期三
求教
1. Windows update
我的電腦仍然用 Windows XP。最近一次 windows update,防火牆告之如下訊息:
微軟的 KB2898855 條目語焉不詳,卻指向另一篇編號 MS14-009 的 Microsoft Security Bulletin。通告內容和以往的大同小異,都是「若用家訪問某些做了手腳的網站,攻擊者就可以取得用戶電腦的管理權限」之類,無甚特別。問題是,為何此 security update 要連結蘋果日報網站?就算該網站真的被人做了手腳,微軟亦無理由拿用家的電腦來做實驗。又抑或微軟會出賣用戶的資料給壹傳媒?這又很難想象,特別是如此大模廝樣,真是匪夷所思。這究竟是怎麼一回事?
2. Linux laptop
最近想買部唔好太貴的一手 laptop 用來裝 Linux。我只試過在桌上型電腦裝 Linux,而且最近一次還是 Redhat 仍未推出稱為 Fedora 的版本的時候(即係起碼十年前啦)。於 laptop 電腦裝 Linux 就毫無經驗,感覺好冒險。不知大家有無好介紹?價錢希望在 $9000 樓下,螢幕 14 吋或以上,必須易於換電池或有 external battery pack,可以兩舊電就捱到八粒鐘(以一般上網及 programming 計)。(話時話,其實家下的 laptop 有幾多有 external battery pack 嘅呢?)CPU 同 harddisk 都無乜所謂,唔好太差就得,但係 graphics 就最好至少有 Intel HD Graphics 4000 (若是 integrated graphics) 或 Nvidia (若是獨立的 graphics chip)。Model 唔好太舊就 OK。
昨日逛街見到聯想的 E431,八千文左右,個樣 OK,不過在網上找到一個 Ubuntu 用家的 review,似乎唔多老黎。E431 的 trackpad 又好像有一個嶄新(即係未經時間考驗)的設計,好多人鬧。一些 Linux 網站雖然有 hardware compatibility list,但其所列的電腦,香港未必有貨,而且有關的 comments 或 reviews 又往往太簡略,例如只有 minor problems 之類,讀後很不放心。
我的電腦仍然用 Windows XP。最近一次 windows update,防火牆告之如下訊息:
微軟的 KB2898855 條目語焉不詳,卻指向另一篇編號 MS14-009 的 Microsoft Security Bulletin。通告內容和以往的大同小異,都是「若用家訪問某些做了手腳的網站,攻擊者就可以取得用戶電腦的管理權限」之類,無甚特別。問題是,為何此 security update 要連結蘋果日報網站?就算該網站真的被人做了手腳,微軟亦無理由拿用家的電腦來做實驗。又抑或微軟會出賣用戶的資料給壹傳媒?這又很難想象,特別是如此大模廝樣,真是匪夷所思。這究竟是怎麼一回事?
2. Linux laptop
最近想買部唔好太貴的一手 laptop 用來裝 Linux。我只試過在桌上型電腦裝 Linux,而且最近一次還是 Redhat 仍未推出稱為 Fedora 的版本的時候(即係起碼十年前啦)。於 laptop 電腦裝 Linux 就毫無經驗,感覺好冒險。不知大家有無好介紹?價錢希望在 $9000 樓下,螢幕 14 吋或以上,必須易於換電池或有 external battery pack,可以兩舊電就捱到八粒鐘(以一般上網及 programming 計)。(話時話,其實家下的 laptop 有幾多有 external battery pack 嘅呢?)CPU 同 harddisk 都無乜所謂,唔好太差就得,但係 graphics 就最好至少有 Intel HD Graphics 4000 (若是 integrated graphics) 或 Nvidia (若是獨立的 graphics chip)。Model 唔好太舊就 OK。
昨日逛街見到聯想的 E431,八千文左右,個樣 OK,不過在網上找到一個 Ubuntu 用家的 review,似乎唔多老黎。E431 的 trackpad 又好像有一個嶄新(即係未經時間考驗)的設計,好多人鬧。一些 Linux 網站雖然有 hardware compatibility list,但其所列的電腦,香港未必有貨,而且有關的 comments 或 reviews 又往往太簡略,例如只有 minor problems 之類,讀後很不放心。
Label(s):
Computing
2012年10月14日星期日
大感動,Radioplayer!
英國各電台當中,我最喜歡的是倫敦的 Magic 105.4 電台,貪佢揀的歌比較啱聽,同埋佢嘅口號 "More music, less talk" 毫無花假。BBC Radio 我反而聽得少。後來不知是英國政府規定,抑或是版權問題,英國各電台的互聯網廣播,若非限制只於英國本土播放,就是要求海外聽眾證實自己有資格收聽(例如輸入有效的 UK postcode),方可接收廣播。結果我要靠 VPN 接駁到英國的 server,方能在香港聽到 Magic 的廣播,相當麻煩。免費的 VPN 有幾安全,也成疑問。通常我都是連接了 VPN 之後,打開 browser,上 Magic 的 website,待它的 player initialized 之後就立即中斷 VPN 的接駁,免得引起安全問題。開開關關,都咪話唔濕滯。
直到昨天我才發現,原來 BBC 聯同另外幾個電台,搞了一個 Radioplayer,用它來接駁 Magic,竟然不用 VPN 也可以聽到廣播。以後唔使煩,真係大感動!而今我主要都係用佢來聽 Magic 或者 LBC 的 talk shows。儘管 LBC 有些主持人的觀點太過右派,唔係我杯茶,但是聽下外國的 talk shows,令自己的世界無咁封閉,都是好事。
順帶一提,用 Radioplayer 來上某些電台,第一次仍是要輸入一個有效的 UK postcode 的。讀者求其輸入一個有效的就可以。英國的 postcode 中,按字母排序,最短兼最簡單的,似乎是 B1 1AA。若讀者無記性,實際上 Radioplayer 的 About 頁當中也有一個有效的 UK postcode,請自己找找看。
Label(s):
Computing
2012年9月20日星期四
Julia 初體驗の立法會選舉勝算 DIY
我慣用 C++ 與 Matlab/Octave,偶爾也用 Python 及 R。近年眼見不少有趣語言出現,我尤為喜歡 Ruby, D(兩者其實都不算新), Scala 及 Chapel,可是除了 Ruby 我依然計劃會抽時間學之外,其餘都只得三十秒熱度。直至最近偶然碰到 Julia,覺得應該先與她(實在無法說「它」呀)把臂同遊。
C++ 的發明人 Bjarne Stroustrup 將 C++ 形容為 "a general purpose programming language with a bias towards systems programming"。依此說法,Julia 大概就是 "a general purpose programming language with a bias towards scientific computing" 了。若不計 Julia 語法上對矩陣的直接支援,我想一般 programmers 應該不會將她聯想成 domain-specific language 吧。
我昨天才下載 Julia,約會了一日,她給我的第一印象,是她絕對有潛力成為 Matlab 殺手或 R 殺手。無論是語法的簡潔程度、data structures 的數量、語法上對 functional programming, generic programming 及 parallel computing 的支援,抑或程式的執行速度,Julia 都明顯超越對手,網上不少 Matlab 與 R 用家亦對她頗為讚賞。她也借用了 Ruby, Python, Matlab 與 C/C++ 語法當中一些優良部份,我學習時倍感親切。
Julia 今年一月才出 1.0 版本,算係有女初長成,距離亭亭玉立還有一段日子,現在仍有不少未成熟的地方,不過已經夠足我做練習用。前文提過,計算立法會選舉各競選名單的勝算,可用多項式分佈的常態逼近當成投票的分佈。利用蒙地卡羅模擬實驗,就可以計算出各名單的勝算。文友電鋸於選舉前已經做過類似的計算,此處只是當成我第一次的 Julia 編程練習。
先說明計算細節。設 $\mathbf{p} = (p_1,\ldots,p_n)^\top = $ 民調所得各名單的支持度 ($\sum_i p_i = 1$),而 $n$ 是樣本數,譬如 NOW 新聞台於九月七日報道(調查時窗為九月二至六日)的結果為
$$\mathbf{p}=\frac{1}{101} (4, 7, 5, 7, 1, 2, 16, 9, 3, 3, 8, 4, 1, 8, 1, 12)^\top,\ n=503.$$
(由於 NOW 新聞台四捨五入,以上向量內各數字的總和為 101 而非 100。)我們的做法,是模擬多次投票實驗。每次實驗,均由 n=503 位選民,每人隨機投一張名單一票。投票的概率由 $\mathbf{p}$ 決定。換句話說,每一名選民都會有 $p_1=\frac4{101}$ 的機會投票予第一張名單、$p_2=\frac7{101}$ 的機會予第二張名單,餘此類推。當 503 人都投完票,就可以按比例代表制查出名單上各人是否當選,查核完畢,就完成了一次實驗。重覆同樣實驗許多次 ── 譬如 1,000,000 次,就完成了整個模擬過程。整個過程當中,若排在七號名單第二順位的余若薇當選了300,000 次,她當選的概率就估計為 300,000/1,000,000 = 0.3,其他人的當選概率也用同一方式估計。
n = 503 位選民每人按 $\mathbf{p}$ 的概率來投票,即是說各名單得票 $(X_1,\ldots,X_m)$ (今屆新界西有 m=16 張競選名單)的分佈為 $\textrm{Multinomial}(n, \mathbf{p})$。多項式分佈的常態逼近公式,可參考本網誌前文,當中用到的正交矩陣 Q 的構作方法,則見我另一篇網誌。總括來說,設
$$
\begin{eqnarray}
v &=& \frac12 \left(
\begin{bmatrix}0\\ \vdots\\0\\1\end{bmatrix} -
\begin{bmatrix}\sqrt{p_1}\\ \vdots\\\sqrt{p_m}\end{bmatrix}
\right),\\
M &=&
\begin{bmatrix}\sqrt{\frac{p_1}n}\\ &\ddots\\&&\sqrt{\frac{p_m}n}\end{bmatrix}
\left(I_m - 2\frac{vv^\top}{\|v\|^2}\right).
\end{eqnarray}
$$若每次投票實驗,我們皆能夠生成 $m-1$ 個服從標準常態分佈的隨機數字 $Z_1, \ldots, Z_{m-1}$(重申,m 是競選名單數目,n 為投票人數),則每次實驗各名單的得票率可模擬為:
$$
\begin{bmatrix}\frac{X_1}n\\ \vdots\\ \frac{X_m}n\end{bmatrix}\approx \mathbf{p} + M\begin{bmatrix} Z_1\\ \vdots\\ Z_{m-1}\\ 0\end{bmatrix}.
$$
生成得票率之後,將它正規化為 $m$ 倍:
$$\mathbf{f} = (f_1, \ldots, f_m)^\top = m\left(\frac{X_1}n, \ldots, \frac{X_m}n\right)^\top,$$
之後就可以點票。正規化後的黑爾數額為 1(原本黑爾數額為 1/m,乘以 m 倍就變成 1)。每個 $f_k$ 都是一個實數,其整數部份 $\lfloor f_k\rfloor$ 代表第 k 張名單因超過黑爾數額而取得的議席數目,小數部份 $r_k = f_k - \lfloor f_k\rfloor$ 代表餘額。比較各餘額的大小,就知道餘下 $m - \sum_k \lfloor f_k\rfloor$ 個議席落入誰家。最後程式如下:
我和 Julia 還不是很熟。上面有些迴圈,相信可以用比較 functional programming 的方式寫得精簡一些。
按上述 NOW 新聞台的調查結果,由 Julia 所計算,十六張名單中各候選人(是候選人,不是候選名單)的當選概率依次為:
若只想知道那九位候選人有最高機會當選,那其實毋須搞甚麼模擬實驗,因為以上當選概率的高低名次,基本上與民調得出的支持度的高低排列相同。因此,模擬實驗結果中勝算最高的九位候選人,就是民調結果中支持度最高那九位。這類勝算計算的目的,其實並非要找出最有機會當選的是誰,而是要反映這些勝算較高的候選人,與其他候選人的差距。
這個方法也有它的毛病,當中最嚴重的,是它沒有考慮政黨配票的情形。以上例來說,民建聯梁志祥與陳恒鑌的支持度一直低企,約四、五個巴仙左右,可是到了選舉日,他們的得票率比起民調結果大幅上升,相反,譚耀宗的得票率就比民調結果低許多(變成約 8%)。要考慮配票,就要考慮各政黨互相鬥法,結果可能要計算隨機博奕下的 Nash equilibrium。除了較複雜之外,均衡點是否存在,是否唯一,亦造成很大的技術困難。
C++ 的發明人 Bjarne Stroustrup 將 C++ 形容為 "a general purpose programming language with a bias towards systems programming"。依此說法,Julia 大概就是 "a general purpose programming language with a bias towards scientific computing" 了。若不計 Julia 語法上對矩陣的直接支援,我想一般 programmers 應該不會將她聯想成 domain-specific language 吧。
我昨天才下載 Julia,約會了一日,她給我的第一印象,是她絕對有潛力成為 Matlab 殺手或 R 殺手。無論是語法的簡潔程度、data structures 的數量、語法上對 functional programming, generic programming 及 parallel computing 的支援,抑或程式的執行速度,Julia 都明顯超越對手,網上不少 Matlab 與 R 用家亦對她頗為讚賞。她也借用了 Ruby, Python, Matlab 與 C/C++ 語法當中一些優良部份,我學習時倍感親切。
Julia 今年一月才出 1.0 版本,算係有女初長成,距離亭亭玉立還有一段日子,現在仍有不少未成熟的地方,不過已經夠足我做練習用。前文提過,計算立法會選舉各競選名單的勝算,可用多項式分佈的常態逼近當成投票的分佈。利用蒙地卡羅模擬實驗,就可以計算出各名單的勝算。文友電鋸於選舉前已經做過類似的計算,此處只是當成我第一次的 Julia 編程練習。
先說明計算細節。設 $\mathbf{p} = (p_1,\ldots,p_n)^\top = $ 民調所得各名單的支持度 ($\sum_i p_i = 1$),而 $n$ 是樣本數,譬如 NOW 新聞台於九月七日報道(調查時窗為九月二至六日)的結果為
$$\mathbf{p}=\frac{1}{101} (4, 7, 5, 7, 1, 2, 16, 9, 3, 3, 8, 4, 1, 8, 1, 12)^\top,\ n=503.$$
(由於 NOW 新聞台四捨五入,以上向量內各數字的總和為 101 而非 100。)我們的做法,是模擬多次投票實驗。每次實驗,均由 n=503 位選民,每人隨機投一張名單一票。投票的概率由 $\mathbf{p}$ 決定。換句話說,每一名選民都會有 $p_1=\frac4{101}$ 的機會投票予第一張名單、$p_2=\frac7{101}$ 的機會予第二張名單,餘此類推。當 503 人都投完票,就可以按比例代表制查出名單上各人是否當選,查核完畢,就完成了一次實驗。重覆同樣實驗許多次 ── 譬如 1,000,000 次,就完成了整個模擬過程。整個過程當中,若排在七號名單第二順位的余若薇當選了300,000 次,她當選的概率就估計為 300,000/1,000,000 = 0.3,其他人的當選概率也用同一方式估計。
n = 503 位選民每人按 $\mathbf{p}$ 的概率來投票,即是說各名單得票 $(X_1,\ldots,X_m)$ (今屆新界西有 m=16 張競選名單)的分佈為 $\textrm{Multinomial}(n, \mathbf{p})$。多項式分佈的常態逼近公式,可參考本網誌前文,當中用到的正交矩陣 Q 的構作方法,則見我另一篇網誌。總括來說,設
$$
\begin{eqnarray}
v &=& \frac12 \left(
\begin{bmatrix}0\\ \vdots\\0\\1\end{bmatrix} -
\begin{bmatrix}\sqrt{p_1}\\ \vdots\\\sqrt{p_m}\end{bmatrix}
\right),\\
M &=&
\begin{bmatrix}\sqrt{\frac{p_1}n}\\ &\ddots\\&&\sqrt{\frac{p_m}n}\end{bmatrix}
\left(I_m - 2\frac{vv^\top}{\|v\|^2}\right).
\end{eqnarray}
$$若每次投票實驗,我們皆能夠生成 $m-1$ 個服從標準常態分佈的隨機數字 $Z_1, \ldots, Z_{m-1}$(重申,m 是競選名單數目,n 為投票人數),則每次實驗各名單的得票率可模擬為:
$$
\begin{bmatrix}\frac{X_1}n\\ \vdots\\ \frac{X_m}n\end{bmatrix}\approx \mathbf{p} + M\begin{bmatrix} Z_1\\ \vdots\\ Z_{m-1}\\ 0\end{bmatrix}.
$$
生成得票率之後,將它正規化為 $m$ 倍:
$$\mathbf{f} = (f_1, \ldots, f_m)^\top = m\left(\frac{X_1}n, \ldots, \frac{X_m}n\right)^\top,$$
之後就可以點票。正規化後的黑爾數額為 1(原本黑爾數額為 1/m,乘以 m 倍就變成 1)。每個 $f_k$ 都是一個實數,其整數部份 $\lfloor f_k\rfloor$ 代表第 k 張名單因超過黑爾數額而取得的議席數目,小數部份 $r_k = f_k - \lfloor f_k\rfloor$ 代表餘額。比較各餘額的大小,就知道餘下 $m - \sum_k \lfloor f_k\rfloor$ 個議席落入誰家。最後程式如下:
我和 Julia 還不是很熟。上面有些迴圈,相信可以用比較 functional programming 的方式寫得精簡一些。
按上述 NOW 新聞台的調查結果,由 Julia 所計算,十六張名單中各候選人(是候選人,不是候選名單)的當選概率依次為:
- 郭家麒 (1.0)
- 譚耀宗 (1.0)
- 李卓人 (0.999993)
- 田北辰 (0.99991)
- 李永達 (0.99954)
- 梁耀忠 (0.999528)
- 陳偉業 (0.996816)
- 麥美娟 (0.996756)
- 陳樹英 (0.918242)
- 余若薇 (0.821678)
- 陳恒鑌 (0.716208)
- 梁志祥 (0.716037)
- 陳一華 (0.338804)
- 何君堯 (0.338146)
- 龍瑞卿 (0.066209)
- 曾健成 (0.065039)
- 譚駿賢 (0.004338)
- 麥業成 (0.002589)
- 陳強 (0.002561)
- 張慧晶 (0.000565)
若只想知道那九位候選人有最高機會當選,那其實毋須搞甚麼模擬實驗,因為以上當選概率的高低名次,基本上與民調得出的支持度的高低排列相同。因此,模擬實驗結果中勝算最高的九位候選人,就是民調結果中支持度最高那九位。這類勝算計算的目的,其實並非要找出最有機會當選的是誰,而是要反映這些勝算較高的候選人,與其他候選人的差距。
這個方法也有它的毛病,當中最嚴重的,是它沒有考慮政黨配票的情形。以上例來說,民建聯梁志祥與陳恒鑌的支持度一直低企,約四、五個巴仙左右,可是到了選舉日,他們的得票率比起民調結果大幅上升,相反,譚耀宗的得票率就比民調結果低許多(變成約 8%)。要考慮配票,就要考慮各政黨互相鬥法,結果可能要計算隨機博奕下的 Nash equilibrium。除了較複雜之外,均衡點是否存在,是否唯一,亦造成很大的技術困難。
2011年5月2日星期一
爛 gag
剛剛想到的。
The advent of object-oriented programming marked the first step to make programming languages more human-like.
Reason: because most objects have private parts.
The advent of object-oriented programming marked the first step to make programming languages more human-like.
Reason: because most objects have private parts.
Label(s):
Computing
2011年3月24日星期四
尋找平井憲夫
福島核事故發生後,中文網絡流傳一篇繙譯文章,題為《前核電廠技師的瀝血控訴》(日文原文;中文題目為某些煽情譯者所作)。有些讀者懷疑文章為偽造,原因是網絡上似乎搜索不到作者平井憲夫的生平、照片或他所代表的「原発被曝労働者救済センター」組織網頁。
我想現代人大概太習慣使用互聯網,忘記了上世紀九十年代仍是互聯網的萌芽時期。不少當時響噹噹的名字,例如 Netscape、ICQ、Excite、Geocities、AltaVista 等等,大多若非消聲匿跡,就是變得微不足道。建於九十年代,而現在已消失的網頁或網站,更加多不勝數。平井據稱於九七年病逝,若然如此,他的資料只存於紙上媒體,或曾經上網但現已消失,是十分可能的事,至於他代表的機構,按文章所指,似是為了向電力公司提出訴訟而設立。文章指該機構後繼無人,現已關閉,也沒有不合理的地方。
最基本的 facts check,其實花不到五分鐘 ── 要尋找平井憲夫其人,最直接的方法,是搜索實體書刊,因此,該用的搜尋器,是 Google Books 與 Amazon,而非 Google、雅虎或 Bing 的 web search。我從 Google Books 搜尋「平井憲夫 原発」,馬上就找到刊於 2000 年前,有關他的記錄,這些書刊更有部份是學術期刊。從搜尋結果可見,平井生前似乎真的是質疑核電安全的運動家。Amazon 則沒有平井著作的書目,卻回報了幾本與核電安全有關的書,可能是書的內文提過平井憲夫。至於前述網文是否真的由平井所寫,內容各部份孰對孰錯,此處就不談了。討論這篇網文的文章有許多,各位可以自己找。
我想現代人大概太習慣使用互聯網,忘記了上世紀九十年代仍是互聯網的萌芽時期。不少當時響噹噹的名字,例如 Netscape、ICQ、Excite、Geocities、AltaVista 等等,大多若非消聲匿跡,就是變得微不足道。建於九十年代,而現在已消失的網頁或網站,更加多不勝數。平井據稱於九七年病逝,若然如此,他的資料只存於紙上媒體,或曾經上網但現已消失,是十分可能的事,至於他代表的機構,按文章所指,似是為了向電力公司提出訴訟而設立。文章指該機構後繼無人,現已關閉,也沒有不合理的地方。
最基本的 facts check,其實花不到五分鐘 ── 要尋找平井憲夫其人,最直接的方法,是搜索實體書刊,因此,該用的搜尋器,是 Google Books 與 Amazon,而非 Google、雅虎或 Bing 的 web search。我從 Google Books 搜尋「平井憲夫 原発」,馬上就找到刊於 2000 年前,有關他的記錄,這些書刊更有部份是學術期刊。從搜尋結果可見,平井生前似乎真的是質疑核電安全的運動家。Amazon 則沒有平井著作的書目,卻回報了幾本與核電安全有關的書,可能是書的內文提過平井憲夫。至於前述網文是否真的由平井所寫,內容各部份孰對孰錯,此處就不談了。討論這篇網文的文章有許多,各位可以自己找。
Label(s):
Computing
2011年3月16日星期三
包剪揼
像我等走在時代末端的老式人,知道有這個電腦包剪捶網頁的時候,大概許多人已經玩過。遊戲難度分兩級,新手級的 AI 會根據你的習慣制訂決策,老手級的 AI 會依據它過往二十萬次對局歷史來砲製你。我剛剛試完新手級(如圖),既知它以你的習慣來作判斷,只要逆向思考,要勝出並不困難,但由於不清楚 AI 的詳細算則,要完全壓制對方就沒那麼容易了。以下是圖中的對局歷史,立此存照。
1) rock - rock
2) rock - scissors
3) scissors - paper
4) paper - scissors
5) paper - rock
6) rock - scissors
7) paper - rock
8) scissors - paper
9) rock - scissors
10) paper - rock
11) paper - rock
12) scissors - paper
13) scissors - paper
14) paper - scissors
15) rock - scissors
16) rock - scissors
17) rock - rock
18) paper - rock
19) scissors - rock
20) scissors - paper
後話:喔,原來凡玩夠五局,就可以叫電腦披露它以後每步會出甚麼,和解釋為何要這樣出(見圖中右上角藍色部份 "See what the computer is thinking")。現在既知其詳細算則,那麼毋須叫它披露每一步,也可以輕易得到完全勝利:
又後話:老手級比新手級難得多,要贏或者打和並不困難,但要拉開距離就有點麻煩。按 AI 的解說,它是以對方在過去四次對局的記錄作為一個 hash key (即總共有 38=6561 個 keys),去尋找人類玩家於二十萬次對局中最可能出的招數。理論上,由於這是個 deterministic algorithm,因此只要集齊 6561 種情況下對方的決策,就能必勝。然而這太費時失事。不知讀者有沒有簡單而有效的對策?
1) rock - rock
2) rock - scissors
3) scissors - paper
4) paper - scissors
5) paper - rock
6) rock - scissors
7) paper - rock
8) scissors - paper
9) rock - scissors
10) paper - rock
11) paper - rock
12) scissors - paper
13) scissors - paper
14) paper - scissors
15) rock - scissors
16) rock - scissors
17) rock - rock
18) paper - rock
19) scissors - rock
20) scissors - paper
後話:喔,原來凡玩夠五局,就可以叫電腦披露它以後每步會出甚麼,和解釋為何要這樣出(見圖中右上角藍色部份 "See what the computer is thinking")。現在既知其詳細算則,那麼毋須叫它披露每一步,也可以輕易得到完全勝利:
又後話:老手級比新手級難得多,要贏或者打和並不困難,但要拉開距離就有點麻煩。按 AI 的解說,它是以對方在過去四次對局的記錄作為一個 hash key (即總共有 38=6561 個 keys),去尋找人類玩家於二十萬次對局中最可能出的招數。理論上,由於這是個 deterministic algorithm,因此只要集齊 6561 種情況下對方的決策,就能必勝。然而這太費時失事。不知讀者有沒有簡單而有效的對策?
![]() |
| 剛完成四十次老手級對局;結果陷入苦戰,無法拉開差距 |
Label(s):
Computing
2011年1月28日星期五
舊聞の綠壩技術曝光
兩年前,我們笑大陸的網絡審查軟件(哎,明明是審查,不要說「過濾」啦)「綠壩」連 Hello Kitty 都打成色情圖像,也有論者指控綠壩「老翻」了外國軟件。現在維基解密將綠壩的技術曝光,才發現這軟件原來多少也有自行製作的部份。雖然只是將現成的技術炒埋一碟,但也算有紋有路。我無耐性睇晒成份文件,不知它要判定圖像是否色情的有關運算是於 client 還是 server 上進行,不過驟眼看來,若要 do the computations on the fly from server side 的話,計算量都幾大,恐怕用家會感覺到明顯的時滯。
china-green-dam-censorship-negotiation-2008.pdf.torrent
Magnet link: magnet:?xt=urn:btih:ERDPLRX5FQAIKRLVTNV3JEK4K4RHULKB
china-green-dam-censorship-negotiation-2008.pdf.torrent
Magnet link: magnet:?xt=urn:btih:ERDPLRX5FQAIKRLVTNV3JEK4K4RHULKB
Label(s):
Computing
2010年4月28日星期三
谷歌勝瓜地圖香港地名大問答
繼 Google Map 香港地圖出現簡體字(最近已撤回做法)之後, 大陸版的 Google 地图也獻新猶,推出頗有殖民地通勝式譯名風的香港地圖,例如
(Updated 2010-10-29: ditu.google.cn fixed the translation problem on July 6, 2010. It now uses traditional-to-simplified chinese translation to handle the street names.)
為了懷念英治年代的美好日子,本博現推出「谷歌勝瓜地圖香港地名大問答」(勝瓜=通勝式煲冬瓜譯法),冠軍可獲博主兩年前捐出但無人認領,當時「充滿體香、從未洗過的宅男內褲一條」。
以下列出大陸版谷歌地圖所載香港地名或街道名。讀者每答出一個正確原名(中英均可),即得一分。答案列於文末。歡迎留言表示成績。由於中文地名的粵音英譯再譯回勝瓜實在太難辨認,所以以下問題所針對的,將以英文地名為主。另外,香港有些英文地名(如 Bristol Street)的正式中譯用雅譯(碧仙桃街),儘管谷歌地圖用王道的譯法將英文名譯回中文(布里斯托尔大街),但結果不可能與中文雅譯相同。由於這個問答遊戲考的是勝瓜而非地理,這類雅譯地名亦將被排除在外。
Level 0: 完全無難度
Level 0
迪帕特门特奥夫马尼季门特&马基廷,瑟亨康波利泰克尼克大学即是
Department of Management and Marketing, The Hong Kong Polytechnic University
(Updated 2010-10-29: ditu.google.cn fixed the translation problem on July 6, 2010. It now uses traditional-to-simplified chinese translation to handle the street names.)
為了懷念英治年代的美好日子,本博現推出「谷歌勝瓜地圖香港地名大問答」(勝瓜=通勝式煲冬瓜譯法),冠軍可獲博主兩年前捐出但無人認領,當時「充滿體香、從未洗過的宅男內褲一條」。
以下列出大陸版谷歌地圖所載香港地名或街道名。讀者每答出一個正確原名(中英均可),即得一分。答案列於文末。歡迎留言表示成績。由於中文地名的粵音英譯再譯回勝瓜實在太難辨認,所以以下問題所針對的,將以英文地名為主。另外,香港有些英文地名(如 Bristol Street)的正式中譯用雅譯(碧仙桃街),儘管谷歌地圖用王道的譯法將英文名譯回中文(布里斯托尔大街),但結果不可能與中文雅譯相同。由於這個問答遊戲考的是勝瓜而非地理,這類雅譯地名亦將被排除在外。
Level 0: 完全無難度
- 约旦
- 奥申公园
- 亨康迪斯内兰
- 卡那封路
- 金乔治菲夫斯公园
- 海伊艾兰水库
- 考伦贝伊
- 艾斯豪斯街
- 亨康动物-伯塔尼尔加登斯
- 马格津加普路
- 塞孔大街
- 阿维纽奥夫斯塔斯
- 章克申路公园
- 米德勒韦尔
- 哈皮瓦利斯波茨格朗德
- 伊莱克特里克路
- 埃克波普罗米纳德
- 克利尔沃特贝伊康特利公园
- 南奇纳阿斯菜蒂克阿索西埃申斯泰迪尔姆
- 迪西普林德萨维斯波茨&雷克里埃申俱乐部
- 坎普街
- 鲍恩路
- 斯塔蒂尤广场
- 拉德街
- 纳丹路
- 考伦蔡或柴公园
- 哈姆由宇街
- 塔伊柄单街
- A班德孔湾路
- 萨恩亚特锡恩纪念公园
答案
Level 0
- 约旦 = 佐敦 Jordan
- 奥申公园 = 海洋公園 Ocean Park
- 亨康迪斯内兰 = 香港迪士尼樂園 Hong Kong Disneyland
- 卡那封路 = 加拿分路 Carnarvon Road
- 金乔治菲夫斯公园 = 佐治五世紀念公園 King George V Memorial Park
- 海伊艾兰水库 = 萬宜水庫 High Island Reservoir
- 考伦贝伊 = 九龍灣 Kowloon Bay
- 艾斯豪斯街 = 雪廠街 Ice House Street
- 亨康动物-伯塔尼尔加登斯 = 香港動植物公園 Hong Kong Zoological and Botanical Gardens
- 马格津加普路 = 馬己仙峽道 Magazine Gap Road
- 塞孔大街 = 第二街 Second Street
- 阿维纽奥夫斯塔斯 = 星光大道 Avenue of Stars
- 章克申路公园 = 聯合道公園 Junction Road Park
- 米德勒韦尔 = 半山 Mid-level
- 哈皮瓦利斯波茨格朗德 = 跑馬地運動場 Happy Valley Sports Ground
- 伊莱克特里克路 = 電氣道 Electric Road
- 埃克波普罗米纳德 = 博覽海濱花園 Expo Promenade
- 克利尔沃特贝伊康特利公园 = 清水灣郊野公園 Clear Water Bay Country Park
- 南奇纳阿斯菜蒂克阿索西埃申斯泰迪尔姆 = 南華體育會運動場 South China Athletic Association Stadium
- 迪西普林德萨维斯波茨&雷克里埃申俱乐部 = 紀律人員體育及康樂會 Disciplined Services Sports & Recreation Club
- 坎普街 = 營盤街 Camp Street
- 鲍恩路 = 寶雲路 Bowen Road
- 斯塔蒂尤广场 = 皇后像廣場 Statue Square
- 拉德街 = 樓梯街 Ladder Street
- 纳丹路 = 彌敦道 Nathan Road
- 考伦蔡或柴公园 = 九龍仔公園 Kowloon Tsai Park
- 哈姆由宇街 = 鹹魚街 Ham Yu Street
- 塔伊柄单街 = 太平山街 Tai Ping Shan Street
- A班德孔湾路 = 亞公灣路 A Kung Wan Road
- 萨恩亚特锡恩纪念公园 = 中山紀念公園 Sun Yat Sen Memorial Park
2010年4月21日星期三
维基百科:申請罷免管理員/Shizhao/第4次
(link)
若辛辛苦苦寫了一大篇文章,卻給人一下子刪掉,當然困擾,不過我並非當事人,所以本來不打算投票。況且贊成罷免那一方,舉證有些混亂,令我不是很瞭解狀況,不過當我看到「南昌舉事」的例子的時候,就覺得該管理員真的做得太過火了,所以投了如下一票:
投票區中,赫然見到電鋸的一票:
除了他,還有另外三人都因為無寫出投票理由,以至維基百科有上述投票附註,不過只有電鋸才有以上可圈可點的句子。究竟「莫須有」是沒有理由,抑或本身是像「既然刪除無須理由,提刪者也該嚐嚐同樣滋味」這般的「後設」(meta) 理由,真是一個富哲學味的問題。
若辛辛苦苦寫了一大篇文章,卻給人一下子刪掉,當然困擾,不過我並非當事人,所以本來不打算投票。況且贊成罷免那一方,舉證有些混亂,令我不是很瞭解狀況,不過當我看到「南昌舉事」的例子的時候,就覺得該管理員真的做得太過火了,所以投了如下一票:
(+)支持罷免,認同指控。我覺得Shizhao君 對維基百科的本質有很大誤解。以知名度為例,根據頁面統計,前面提及被Shizhao君提刪的福佳始終有你連同它重新定向的福佳歌曲系列,於2009年一共被瀏覽1192+624=1816次,比Shizhao君自己創建的幼學瓊林條目的386次或阿那克萨哥拉的1415次還要多。其實不論中文抑或外文,絕大部份最受歡迎的維 基百科條目根本都不是傳統百科全書會收錄那些,而是與娛樂、名人、性事或地方(次)文化有關的內容。Shizhao君不懂這點,今次許多投反對票的朋友也 一樣。Shizhao君不理解某些條目的價值,本來還可以請教貢獻者,但他連問也不問,這就是傲慢。他另一項誤解,是錯把中文維基當成大陸中文維基。 一般而言,若不同維基人對同一事物採取不同字眼,編輯應取最普遍的那一個作標準,但若字詞的用法的分別是地區性的,適當的處理就應該是按地區作字詞轉換, 而不是單純的使用最普遍的那個字眼(否則大陸的用法會變成霸權)。然而,按Daniel at HK在前面提到南昌起事例子,Shizhao君不但將大陸的用法強加於 台、港地區的用戶,還違反管理員不應該保護他們牽扯進去的條目的保護頁面方針。這不僅是文化沙文主義,更加是行政失當 了。這不是Shizhao君過去有很大貢獻就可以扺消的。當維基百科無其他手段可以令管理員反省,強制解任就是唯一的出路,否則管理員等於不必為他妨礙其 他人而負責。換了我是管理員,相信也會覺得像「福佳」這種條目根本不應出現在維基百科之中,可是維基百科不是我一個人的百科全書,我無興趣讀的,不表示其他人也不想讀。順帶一提,儘管在「南昌起事」條目的模版中,已設定「台灣正體」版會將題目顯示為「南昌起事」,但不知何故,實際上顯示的仍然是「南昌起義」。
投票區中,赫然見到電鋸的一票:
除了他,還有另外三人都因為無寫出投票理由,以至維基百科有上述投票附註,不過只有電鋸才有以上可圈可點的句子。究竟「莫須有」是沒有理由,抑或本身是像「既然刪除無須理由,提刪者也該嚐嚐同樣滋味」這般的「後設」(meta) 理由,真是一個富哲學味的問題。
Label(s):
Computing
2010年4月12日星期一
小發現
我得承認,自己並不瞭解維基百科。
中文維基百科統計了去年最多人走訪的維基頁面。頭八位是:
1) # 42,728 [ 2.08 %]: Special:Search
2) # 28,970 [ 1.41 %]: 首页
3) # 24,189 [ 1.18 %]: Wikipedia: 首页
4) # 16,208 [ 0.79 %]: Special: 搜索
5) # 7,797 [ 0.38 %]: Category: 台灣維基人
6) # 5,839 [ 0.28 %]: Wiki
7) # 5,513 [ 0.27 %]: 维基百科
8) # 3,136 [ 0.15 %]: Favicon.ico (incl. icon requests)
這些都是技術性的工具頁面或者自我指涉的百科條目。若排除這類頁面,那 2009 年是受歡迎的頭十位是:
9) # 2,633 [ 0.13 %]: 数学
11) # 1,926 [ 0.09 %]: 六四事件
12) # 1,826 [ 0.09 %]: AV女優
16) # 1,115 [ 0.05 %]: 學警狙擊
17) # 1,086 [ 0.05 %]: 葉問
18) # 1,076 [ 0.05 %]: 痞子英雄
19) # 1,034 [ 0.05 %]: 守護甜心!
20) # 1,033 [ 0.05 %]: AV 女優列表
21) # 1,003 [ 0.05 %]: 牛博网
22) # 971 [ 0.05 %]: 中華民國
這實在令我大大的意外。十條條目之中,去了六條其實是「娛樂資訊」,我想一般人心目中的百科全書,不是這個樣子的吧。其餘四條,排首位的是「數學」,這也令我難以索解。數學是小學開始已經有教的科目,為甚麼竟會有這麼多人(平均每日2633個)要查百科全書,瞭解何謂數學?印象中,台港澳的華人並不是那麼關心數學吧。會不會是像舊笑話之中錯把「會計」或「術數」當成「數學」?
英文維基百科也有統計 page hits。去年的頭十位是:
4) # 791,059 [ 0.40 %]: 404 error
9) # 111,896 [ 0.06 %]: The Beatles
11) # 79,734 [ 0.04 %]: Michael Jackson
13) # 72,318 [ 0.04 %]: YouTube
16) # 49,401 [ 0.03 %]: Barack Obama
17) # 48,758 [ 0.02 %]: Deaths in 2009
18) # 46,545 [ 0.02 %]: United States
19) # 42,679 [ 0.02 %]: Facebook
21) # 39,550 [ 0.02 %]: Swine influenza
22)# 33,333 [ 0.02 %]: Eminem
英文維基百科的受歡迎條目,一樣以有關娛樂名人或性事的內容居多,例如接下來的十二位其實是 23) Lost (TV series), 24) Watchmen, 26) World War II, 28) Twitter, 29) Transformers: Revenge of the Fallen, 30) Slumdog Millionaire, 31) Lil Wayne, 32) Adolf Hitler, 33) India, 34) Transformers 2, 36) Scrubs (TV series), 37) Sex。不過就頭十位的條目而言,英文維基百科的訪問者稍為多看較傳統的百科全書內容。
比起英文條目,中文維基的文章點擊分布顯得相當「長尾」,例如排第 22 位的文章,中文維基百科仍有 0.05% 的閱讀人次,但英文維基百科就只得 0.02%。換句話說,英文維基大部份訪問人次點擊的可能都只是頭幾位的文章,而中文維基的偏門文章則有相對較大的讀者份額。不知這有甚麼微言大義。
兩個語言版本的共通處,是日本漫畫《火影忍者》(Naruto) 都有不俗的點擊率:在中文維基是第 33 位 (0.04%),在英文維基是第 47 位 (0.01%)。難道它是全球最受歡迎的漫畫?
中文維基百科統計了去年最多人走訪的維基頁面。頭八位是:
1) # 42,728 [ 2.08 %]: Special:Search
2) # 28,970 [ 1.41 %]: 首页
3) # 24,189 [ 1.18 %]: Wikipedia: 首页
4) # 16,208 [ 0.79 %]: Special: 搜索
5) # 7,797 [ 0.38 %]: Category: 台灣維基人
6) # 5,839 [ 0.28 %]: Wiki
7) # 5,513 [ 0.27 %]: 维基百科
8) # 3,136 [ 0.15 %]: Favicon.ico (incl. icon requests)
這些都是技術性的工具頁面或者自我指涉的百科條目。若排除這類頁面,那 2009 年是受歡迎的頭十位是:
9) # 2,633 [ 0.13 %]: 数学
11) # 1,926 [ 0.09 %]: 六四事件
12) # 1,826 [ 0.09 %]: AV女優
16) # 1,115 [ 0.05 %]: 學警狙擊
17) # 1,086 [ 0.05 %]: 葉問
18) # 1,076 [ 0.05 %]: 痞子英雄
19) # 1,034 [ 0.05 %]: 守護甜心!
20) # 1,033 [ 0.05 %]: AV 女優列表
21) # 1,003 [ 0.05 %]: 牛博网
22) # 971 [ 0.05 %]: 中華民國
這實在令我大大的意外。十條條目之中,去了六條其實是「娛樂資訊」,我想一般人心目中的百科全書,不是這個樣子的吧。其餘四條,排首位的是「數學」,這也令我難以索解。數學是小學開始已經有教的科目,為甚麼竟會有這麼多人(平均每日2633個)要查百科全書,瞭解何謂數學?印象中,台港澳的華人並不是那麼關心數學吧。會不會是像舊笑話之中錯把「會計」或「術數」當成「數學」?
英文維基百科也有統計 page hits。去年的頭十位是:
4) # 791,059 [ 0.40 %]: 404 error
9) # 111,896 [ 0.06 %]: The Beatles
11) # 79,734 [ 0.04 %]: Michael Jackson
13) # 72,318 [ 0.04 %]: YouTube
16) # 49,401 [ 0.03 %]: Barack Obama
17) # 48,758 [ 0.02 %]: Deaths in 2009
18) # 46,545 [ 0.02 %]: United States
19) # 42,679 [ 0.02 %]: Facebook
21) # 39,550 [ 0.02 %]: Swine influenza
22)# 33,333 [ 0.02 %]: Eminem
英文維基百科的受歡迎條目,一樣以有關娛樂名人或性事的內容居多,例如接下來的十二位其實是 23) Lost (TV series), 24) Watchmen, 26) World War II, 28) Twitter, 29) Transformers: Revenge of the Fallen, 30) Slumdog Millionaire, 31) Lil Wayne, 32) Adolf Hitler, 33) India, 34) Transformers 2, 36) Scrubs (TV series), 37) Sex。不過就頭十位的條目而言,英文維基百科的訪問者稍為多看較傳統的百科全書內容。
比起英文條目,中文維基的文章點擊分布顯得相當「長尾」,例如排第 22 位的文章,中文維基百科仍有 0.05% 的閱讀人次,但英文維基百科就只得 0.02%。換句話說,英文維基大部份訪問人次點擊的可能都只是頭幾位的文章,而中文維基的偏門文章則有相對較大的讀者份額。不知這有甚麼微言大義。
兩個語言版本的共通處,是日本漫畫《火影忍者》(Naruto) 都有不俗的點擊率:在中文維基是第 33 位 (0.04%),在英文維基是第 47 位 (0.01%)。難道它是全球最受歡迎的漫畫?
Label(s):
Computing
2010年3月2日星期二
Random shuffling
Doing the Microsoft Shuffle: Algorithm Fail in Browser Ballot; Rob Weir: An Antic Disposition
這是我近日看過的一篇有趣文章。話說歐盟控告微軟的 IE 造成壟斷,雙方後來和解,同意於新版本的 Windows 之中加入選單畫面,讓用家選擇安裝喜歡的瀏覽器(見下圖)。選單中五種瀏覽器的位置,是隨機決定的,不過上述網誌的作者卻發現,五種瀏覽器的位置,實在稱不上是均勻分佈 (uniformly distributed)。後來他深入研究微軟「兜亂」(shuffle) 五個位置所用的程式碼,發現結果相當不平均。
要兜亂一個序列,或者用數學化一點的語言來說,要生成一個隨機置換(這裏「隨機」的意思當然不是照字面解,而是照一般人的用法去解,也就是不止隨機,還要均勻分佈),最方便穩妥的辦法當然是 Fisher-Yates shuffle。用一行 pseudocode去講,就是
微軟捨此不用,反而做類似以下的事情:
當然,p 並非隨機序列,按其內容排序,並不會得出隨機結果,所以微軟排序時,用了以下的隨機「比較函數」(comparator):
換句話題,當你為兩個數目 a 與 b 排大小時,程式所看的並非 a 的數值是否真的小於 b,而是隨機產生一個介乎 -0.5 與 +0.5 之間的數字 x = 0.5 - Math.random(),若 x 是負數,便扮作 a<b;若是正數,則扮作a>b;若 x=0,則當 a=b。
利用這樣的隨機比較函數,當然也會得出隨機置換,只不過置換的分佈既不夠平均,亦因排序方法而異。其實腦筋清楚並對中學的統計學稍為有點認識的人,根本都不會犯上這種錯誤,所以前述文章令我喜歡的地方,並不是它有甚麼令人意外的發現或結論,而是作者竟然肯花那麼多時間去找出實際錯誤的來源。這種探究精神,才真的令我佩服。
該網誌的留言亦非常值得一看。例如 #27 的 Tom 問,若將 Fisher-Yates shuffle 改動成 for (i=1; i<=n; ++i) swap(p[i], p[rand(n)]),為甚麼不算均勻置換?#31 的 Dave 就回答得相當精闢。Tom 另外提及 for (i=1; i<=n; ++i) swap(p[rand(n)], p[rand(n)]),其問題所在也是有趣的思考材料甚至面試題目。(有無讀者可以用簡單的方法指出問題所在?)留言 #52 及 #53 則反映原來人們對統計學的認識,可以相當出人意表。留言 #92 則指出原來微軟所用的蠢方法,一個有名的 Javascript 教學網站亦有教!至於留言 #95 的 Issac 君,與文章作者同樣具探索精神。他發現用微軟所用的隨機比較法,五個位置的置換結果於不同的排序方法之下,差異可以頗為巨大。詳見:
Randomizing by Random-Comparison Sorting (Revisited); 2718.us blog
這是我近日看過的一篇有趣文章。話說歐盟控告微軟的 IE 造成壟斷,雙方後來和解,同意於新版本的 Windows 之中加入選單畫面,讓用家選擇安裝喜歡的瀏覽器(見下圖)。選單中五種瀏覽器的位置,是隨機決定的,不過上述網誌的作者卻發現,五種瀏覽器的位置,實在稱不上是均勻分佈 (uniformly distributed)。後來他深入研究微軟「兜亂」(shuffle) 五個位置所用的程式碼,發現結果相當不平均。
要兜亂一個序列,或者用數學化一點的語言來說,要生成一個隨機置換(這裏「隨機」的意思當然不是照字面解,而是照一般人的用法去解,也就是不止隨機,還要均勻分佈),最方便穩妥的辦法當然是 Fisher-Yates shuffle。用一行 pseudocode去講,就是p = {1, 2, 3, 4, 5}; for (i=n; i>1; --i) swap(p[i], p[rand(i)])
微軟捨此不用,反而做類似以下的事情:
p = {1, 2, 3, 4, 5}; sort(p, RandomSort)
當然,p 並非隨機序列,按其內容排序,並不會得出隨機結果,所以微軟排序時,用了以下的隨機「比較函數」(comparator):
function RandomSort (a,b) {return (0.5 - Math.random());}
換句話題,當你為兩個數目 a 與 b 排大小時,程式所看的並非 a 的數值是否真的小於 b,而是隨機產生一個介乎 -0.5 與 +0.5 之間的數字 x = 0.5 - Math.random(),若 x 是負數,便扮作 a<b;若是正數,則扮作a>b;若 x=0,則當 a=b。
利用這樣的隨機比較函數,當然也會得出隨機置換,只不過置換的分佈既不夠平均,亦因排序方法而異。其實腦筋清楚並對中學的統計學稍為有點認識的人,根本都不會犯上這種錯誤,所以前述文章令我喜歡的地方,並不是它有甚麼令人意外的發現或結論,而是作者竟然肯花那麼多時間去找出實際錯誤的來源。這種探究精神,才真的令我佩服。
該網誌的留言亦非常值得一看。例如 #27 的 Tom 問,若將 Fisher-Yates shuffle 改動成 for (i=1; i<=n; ++i) swap(p[i], p[rand(n)]),為甚麼不算均勻置換?#31 的 Dave 就回答得相當精闢。Tom 另外提及 for (i=1; i<=n; ++i) swap(p[rand(n)], p[rand(n)]),其問題所在也是有趣的思考材料甚至面試題目。(有無讀者可以用簡單的方法指出問題所在?)留言 #52 及 #53 則反映原來人們對統計學的認識,可以相當出人意表。留言 #92 則指出原來微軟所用的蠢方法,一個有名的 Javascript 教學網站亦有教!至於留言 #95 的 Issac 君,與文章作者同樣具探索精神。他發現用微軟所用的隨機比較法,五個位置的置換結果於不同的排序方法之下,差異可以頗為巨大。詳見:
Randomizing by Random-Comparison Sorting (Revisited); 2718.us blog
2010年2月18日星期四
Google Reader 的 Xanga 亂碼問題
近日 Google Reader 顯示許多(所有?)放在 Xanga 的中文網誌時,都出現亂碼,連往日寫下的 entries 亦不能正常顯示,不知其他朋友有無同樣經驗。
有趣的是有些 Xanga 網誌是題目正常但內文亂碼,有些卻兩者都有亂碼。似乎若非 Xanga 本身對網頁的 encoding 支援不足,就是 Google Reader 容錯的能力減低了。暫時在下只能直接打開 Xanga 網頁閱讀。對各 Xanga 人來說,這也許是好事,因為不少 web counters 數人頭的時候,都不包括用 Google Reader 看網誌的讀者,不過對我等懶人來說,就實在太麻煩了。
Update: 在下所看的 Xanga 網誌中,唯一在 Google Reader 無出現亂碼的,是 hystericireul on Xanga,但作者有何秘技,我就不清楚了。
有趣的是有些 Xanga 網誌是題目正常但內文亂碼,有些卻兩者都有亂碼。似乎若非 Xanga 本身對網頁的 encoding 支援不足,就是 Google Reader 容錯的能力減低了。暫時在下只能直接打開 Xanga 網頁閱讀。對各 Xanga 人來說,這也許是好事,因為不少 web counters 數人頭的時候,都不包括用 Google Reader 看網誌的讀者,不過對我等懶人來說,就實在太麻煩了。
Update: 在下所看的 Xanga 網誌中,唯一在 Google Reader 無出現亂碼的,是 hystericireul on Xanga,但作者有何秘技,我就不清楚了。
Label(s):
Computing,
Yet another blog entry
2010年2月12日星期五
Google Xianggang?!
兩年前小博講過 Yahoo! Maps 將香港變 Xianggang,可幸雅虎後來轉性,還 "Hong Kong" 本來面目,誰知現在輪到 Google 搞大陸化。
Google Map 暫時總算還沒有將香港地圖完全用淺薄體 (Trivialised Chinese, a.k.a. Simplified Chinese) 顯示,同情地想,可能只是想附上部份淺薄體地名,方便內地旅客查閱而已,只是此等標記的香港地圖,最好還是用 localisation 的方法與原來的版本分開吧。
Google Map 暫時總算還沒有將香港地圖完全用淺薄體 (Trivialised Chinese, a.k.a. Simplified Chinese) 顯示,同情地想,可能只是想附上部份淺薄體地名,方便內地旅客查閱而已,只是此等標記的香港地圖,最好還是用 localisation 的方法與原來的版本分開吧。
Label(s):
Computing
2009年10月14日星期三
交尾歡,趙完唱,展全圖
這個網站讓人將個人的巫山雲雨戰史上網,簡單的圖例加上短短的感想,無論是戶內戶外、體位抑或安全措施,均一目了然。我佩服網絡人的創意,但同時亦覺得很無聊。
Label(s):
Computing
2009年7月24日星期五
本星期兩單科技界醜聞
鞠躬盡粹,literally 死而後已的富士康 (2038) 員工
UAE Blackberry update was spyware
- 富士康指洩密 保安拘禁毆打 員工失第四代 iPhone跳樓死
- 富士康员工丢失iPhone样机被调查 后跳楼自杀
- 富士康回应:对家属表示歉意 检讨内部管理
- Apple confirms death of iPhone worker in China
UAE Blackberry update was spyware
Label(s):
Computing
2009年6月27日星期六
Circle the cat
很簡單的遊戲,目的是捕捉想逃走的貓。按一下淺綠色圓圈,即可在該格放下深綠色的障礙物,當貓兒無路可逃便算勝出。這個遊戲只有一個竅門,屬數學性質,能夠掌握的話即可百戰百勝。
Label(s):
Computing
2009年6月17日星期三
無聊才造 wall paper
心情有點悶,搵 D 嘢搞下,轉轉 wall paper:
這下才發現要 capture Google map 當 wall paper 很麻煩。Firefox 的 full screen mode 在螢幕上留下一條窄窄的框線(例如見舊文插圖),算不上真的 full screen。IE 的 full screen mode 又於下方留有 status bar,雖然這應該是可以調校的,但是自己年紀大了,腦轉數低了,找了好一會都找不到。後來發現可以寫一個網頁,Javascript 用 window.open(),status = no,但這又要先於 IE 的 internet options 的 security options 選擇讓網頁要求瀏覽器開隱藏 status bar,剎是麻煩。最後一氣之下,索性兩個瀏覽器都不用,寫了個很白痴的 program 來解決問題。不過想攞幅 screen shot 啫,都要搞咁多嘢,唯有嘆句圖像介面的設計已經追不上科技進步。
某人有部大 mon,1680x1050,幫佢整張 wall paper,又發現 Google map 放大到某一級時,螢幕裝唔落香港地圖,縮小一級,香港又太細,而且由於個 mon 係長身,所以見到珠海箇邊 D 陸地,用來做 wall paper,icons 放在左邊會好花,所以折衷一下,將香港向左移,但右下角有一大片海洋,唯有放個垃圾桶平衡一下。
這下才發現要 capture Google map 當 wall paper 很麻煩。Firefox 的 full screen mode 在螢幕上留下一條窄窄的框線(例如見舊文插圖),算不上真的 full screen。IE 的 full screen mode 又於下方留有 status bar,雖然這應該是可以調校的,但是自己年紀大了,腦轉數低了,找了好一會都找不到。後來發現可以寫一個網頁,Javascript 用 window.open(),status = no,但這又要先於 IE 的 internet options 的 security options 選擇讓網頁要求瀏覽器開隱藏 status bar,剎是麻煩。最後一氣之下,索性兩個瀏覽器都不用,寫了個很白痴的 program 來解決問題。不過想攞幅 screen shot 啫,都要搞咁多嘢,唯有嘆句圖像介面的設計已經追不上科技進步。
某人有部大 mon,1680x1050,幫佢整張 wall paper,又發現 Google map 放大到某一級時,螢幕裝唔落香港地圖,縮小一級,香港又太細,而且由於個 mon 係長身,所以見到珠海箇邊 D 陸地,用來做 wall paper,icons 放在左邊會好花,所以折衷一下,將香港向左移,但右下角有一大片海洋,唯有放個垃圾桶平衡一下。
Label(s):
Computing
訂閱:
文章 (Atom)












