重複中大獎 機率、程式或作弊?

財政部舉辦「雲端種樹趣-e起集點樹」抽獎有四人重複中大獎引發熱議,存在「統計」與「系統程式」二方面的可能。

中獎一般都是假設在「等機率」、也就是人人都只有一張籤的前提下。按照媒體報導:「有九萬人抽獎,每個人能夠抽三輪;第一輪有五個中獎名額、第二輪有五個中獎名額、第三輪有九個中獎名額,那同樣四個人中獎二次的機率有多少?」其機率確實趨近於零。

但觀察抽獎辦法,容許一人以多種途徑重複參加;再依其統計,報名註冊的人有九萬多人,而參加抽獎的人次達到十三點六萬人,即有高達四萬多次是重複參加的籤。這時,就不符合「等機率」的前提。

統計定律,抽樣對象如果包括不同質類,則各質類被抽中機率「與各質類的樣本數成正比」,擁有愈多籤的人被抽中的機率愈大,再根據國稅局的說法假設一個最極端的狀況:重複的四萬多籤都是那四人的,即每人有一萬多籤,也就是比其他民衆中獎的機率多一萬倍以上,則約每抽出三個獎,四人之一就會得獎,所以會重複中獎是正常的,甚至是必然的。

不過,如果這四人只是比別人多一百個籤,還是不太可能重複中獎。所以財政部要釋疑的第一步,就是說明這四位到底擁有幾個籤?就可以更清楚的檢定是否可能發生如此極端情況。至於「系統程式」問題,抽獎程式是極爲簡單的程式,一般軟體公司可能不會請資深工程師負責。

自有電腦以來,所有程式語言都提供二個以上的隨機抽樣方法,以前叫「指令」,現在稱爲「函數」及更復雜的「標頭檔案」。以當前最廣泛使用的C語言家族爲例,就包括rand( )和srand( )兩個不同函數,進階的C++,又加上標頭檔案。

在抽獎系統中,每張籤都搭配唯一的流水號式籤號。使用rand( )時,指定範圍(如十三點六萬)後,其出現的數字一定是「固定順序」,也就是一定預先知道第一名、第二名、第三名…到最後一名的籤號。

使用srand( )時,可在( )加入不同類型參數,而不致重複出現固定順序,但也可能因設定疏忽而重複出現。

使用標頭檔案時,其設定比較複雜,預設是不會產生重複、是真正的隨機籤,但如果刻意設定,還是可以製造固定順序。

我們在審查學生作品、政府委託或企業委託專案,經常發現學生、新任程式員或缺乏熱情的程式員,在處理隨機數時,都採用最簡單方法,以致在輸出結果上造成並不隨機,甚至可預知結果。

在一些賭博性電玩案例中,程式員會故意利用以上程式的特性與技巧,製造出「表面看很隨機」,但「實際上完全可控制」產生的數字與發生的條件。

所以,中獎人不必擁有很多籤,只要將中獎的流水號分配給中籤人(反之亦然),即可重複中獎。也就是說,如果參與者擁有籤數沒特別多,卻能夠重複中大獎,就無法排除作弊可能。

因程式而重複中獎,有可能是無意、也可能是故意。在場監督的官員、律師再多,若沒有寫過程式,也沒有系統實務經驗,便無法觀察出來,當然最後只會以「查無不法」結案。