查看單個文章
舊 2024-11-04, 05:33 PM   #1
mini
管理版主
 
mini 的頭像
榮譽勳章
UID - 4144
在線等級: 級別:97 | 在線時長:9909小時 | 升級還需:87小時級別:97 | 在線時長:9909小時 | 升級還需:87小時級別:97 | 在線時長:9909小時 | 升級還需:87小時級別:97 | 在線時長:9909小時 | 升級還需:87小時級別:97 | 在線時長:9909小時 | 升級還需:87小時級別:97 | 在線時長:9909小時 | 升級還需:87小時級別:97 | 在線時長:9909小時 | 升級還需:87小時
註冊日期: 2002-12-07
文章: 13365
精華: 0
現金: 26507 金幣
資產: 3024417 金幣
預設 理想化的 抽獎亂數如何寫?

最近發生財政部電腦抽獎之微乎其微重複領獎事件
就想到 如果不是作弊、後門 甚麼的話
就是亂數函式寫得太爛

一般來講每一種程式語言都有提供簡單的單一指令 亂數函式
大部分雖說是以時間來當種子成員
但每次跑 相似度其實都很近
原因如何? 可能是除了 時間因子外,還有其他參考因子 差異性不大的關係
也就是只要你是同一部機器去跑
最差的情況就是 相似度極高
又如果
電腦抽獎的軟體是以呼叫 獨立的亂數外掛去運行
那就可能發生 重複中獎的情況

那理想的亂數該如何寫呢?
除了多加混和各式的參考因子外
個人覺得應該要用 100%列表法
也就是
1. 先讓軟體跑出一份所有參賽者都至少中獎過一次的序位清單
2. 再把參賽者重複的部分清除
3. 之後再打亂清單
4. 最後再用此清單跑亂數抽出得獎者

如果要避免重複,可以每抽出一位就把序位清單那位抽離
當然也可用比對方式避免重複
甚至抽離後再打亂一次
方法很多

這種方法主要的特性就在於
兼顧人人有中獎的機會
且對不懂程式的人有個易懂的交代

================================
有人會說那不如一開始就爭對名冊跑亂數打亂
再 2 > 3 > 4
當然也是可以的
只是要知道 亂數就是一種
你跑越久就會越亂的設計
如果 做一次 1,絕對會得到比此種方式還亂的結果
越偷懶跑出來的結果會越相似

此帖於 2024-11-06 05:09 PM 被 mini 編輯.
mini 目前離線  
送花文章: 2018, 收花文章: 8013 篇, 收花: 26822 次
回覆時引用此帖
向 mini 送花的會員:
ppp0600 (2024-11-06)
感謝您發表一篇好文章