逼近年末,不少公司在舉辦年會,而抽獎則是一項很重要的事情,每每也是激起員工興趣、氣氛進入高潮的環節。前端
咱們回想一下,電視上一些綜藝節目的抽獎流程是怎麼樣的?一個箱子,要麼已經放在臺上,要麼由一位高挑的美女抱上臺,箱子裏放着紙條或乒乓球,伴隨主持人一聲吶喊:得到一等獎的是誰?話音未落,觀衆開始躁動,場面一度失控,主持人在箱子裏搗鼓半天,終於把手高高舉起,一等獎誕生,獲獎者上臺領獎。程序員
據說,能夠提早把中獎人的紙條或乒乓球粘在特定的地方,手伸進去就能夠精準中獎。別問我是怎麼知道的,這是某個著名主持人的經驗談。算法
再看一下來自網友的吐槽:dom
「咱們公司就是傳統企業,抽獎就是搞個箱子,裏面投放小卡片,中獎的就是廠長的小姨子、大舅哥。。」函數
"我司年會1200人,三個大獎之一還真就被寫抽獎程序的前端程序員本身抽中了,挺尷尬的。。」網站
看來暗箱操做已引發一大批人怨聲載道,影響用戶體驗。公正、透明的抽獎方式須要擺上檯面。那接下來說幾種可能的方案。設計
逢「幾」中獎cdn
逢「幾」中獎,即經過預估抽獎人數和獎品數來判斷,「幾」 = (抽獎人數/獎品數) * N。這是一種最簡單的抽獎算法,適合抽獎人數衆多,並且彼此無聯繫的狀況。現在大爲流行的微博轉發抽獎就經常採用這種算法,即根據轉發次數來決定獎品歸屬,透明並且具備激勵性,讓粉絲更有轉發的熱情。blog
固然這個「幾」也不單是轉發次數,還多是時間,逢某個時間點就能夠抽中,不過這種方案可能產生無人中獎和不少人中獎的狀況,時間點的安排很關鍵!這個時間點一旦公佈出去,那就是秒殺。排序
逢「幾」中獎有不少弊端,可是很是簡單,很容易實現,被不少抽獎活動所採用,有些會公佈抽獎規則,激勵抽獎,有些則不會公佈,其實後臺運行的可能也是這個算法,簡單高效又不失公平。在信息不透明的狀況下,鬼知道你是第幾個抽中的,哈哈。
機率抽獎
所謂機率抽獎是最容易想到的抽獎算法了,這個機率能夠是一成不變的,也能夠是一直在變化調整的。難就難在要採用多大的機率,哪一種狀況下采用哪一種機率。
這個也沒有通用的方案,不一樣的應用場景,所用的機率算法不一樣。有這麼一種算法,根據獎品的過時時間來計算它當前時間的中獎率,當時間逐漸接近獎品過時時間時,中獎機率會發生變化,好比採用線性衰減和平方衰減。
依賴不可控的物理隨機數
設計一個真正公平的抽獎程序,很大程度上就須要考慮如何做弊和反做弊,最重要的是如何讓人信服。若是僅僅考慮使用多個隨機函數結合來加強隨機性,這樣的結果是沒法使人信服的。你說你生成的數字是隨機數,可你怎麼證實呢?畢竟即便是一樣的隨機數生成算法,每次生成的隨機數也必然不同,結果沒法復現。
只要可以使得隨機數生成算法公開而且生成隨機數可復現,就能解決抽獎算法的信任問題。咱們能夠提早公佈隨機數生成算法,並規定隨機數生成種子爲將來的多個不可預知、沒法改變的數據。
以 1000 我的參與抽獎搶 200 個獎品爲例。
2019 年 1 月 24 日公佈隨機數生成算法:
四個 Seed 分別是 1 月 26 日道瓊斯工業指數、納斯達克指數、阿里巴巴股價、騰訊股價,而且對其四捨五入取整數。
最終中獎號碼 = Random % 1000
1 月 24 日每人從 0~999 中選擇一個整數,提交在網站,網站記錄每個人選擇的數字以及提交時間,而且將這個數據實時公開。容許多人選擇同一個數字,若是有多人選擇同一個數字,則按先來後到的順序對這幾我的進行優先級排序。1 月 24 日選好數字以後便不能更改。到了 1 月 26 日,直接根據當天生成的四個 Seed,計算最終中獎號碼,按照偏差大小對全部人進行排序便可。
隨機數生成算法和隨機數生成種子的選擇方式都是提早公開的,隨機數生成結果是能夠復現的,以一己之力影響隨機數生成種子的大小几乎是不可能的(消耗的成本遠遠大於收益),並且還能夠經過增長隨機數生成算法的複雜度和隨機種子的個數來進一步提升算法的健壯性。
這就是現今很是流行的一種抽獎算法,絕對公平、透明、沒有暗箱(除非偷偷給你換了抽獎號碼)!可是這種方法惟一的缺陷是沒法實時抽獎,只能過後抽獎,也就是隻能拿個抽獎號碼等着幸運女神的眷顧。
其實用戶不關心獎品被抽中的機率,只要在活動期間陸續有獎品被抽走便可,只要能控制好每一個獎品的發放時間點和發放順序,大獎不會太快被抽走,直到活動最後階段都保證有獎,活動熱度也能獲得保證。