理想化的 抽獎亂數如何寫?
最近發生財政部電腦抽獎之微乎其微重複領獎事件
就想到 如果不是作弊、後門 甚麼的話
就是亂數函式寫得太爛
一般來講每一種程式語言都有提供簡單的單一指令 亂數函式
大部分雖說是以時間來當種子成員
但每次跑 相似度其實都很近
原因如何? 可能是除了 時間因子外,還有其他參考因子 差異性不大的關係
也就是只要你是同一部機器去跑
最差的情況就是 相似度極高
又如果
電腦抽獎的軟體是以呼叫 獨立的亂數外掛去運行
那就可能發生 重複中獎的情況
那理想的亂數該如何寫呢?
除了多加混和各式的參考因子外
個人覺得應該要用 100%列表法
也就是
1. 先讓軟體跑出一份所有參賽者都至少中獎過一次的序位清單
2. 再把參賽者重複的部分清除
3. 之後再打亂清單
4. 最後再用此清單跑亂數抽出得獎者
如果要避免重複,可以每抽出一位就把序位清單那位抽離
當然也可用比對方式避免重複
甚至抽離後再打亂一次
方法很多
這種方法主要的特性就在於
兼顧人人有中獎的機會
且對不懂程式的人有個易懂的交代
================================
有人會說那不如一開始就爭對名冊跑亂數打亂
再 2 > 3 > 4
當然也是可以的
只是要知道 亂數就是一種
你跑越久就會越亂的設計
如果 做一次 1,絕對會得到比此種方式還亂的結果
越偷懶跑出來的結果會越相似
此帖於 2024-11-06 05:09 PM 被 mini 編輯.
|