MMP,我說每一年年會我怎麼總是中不了獎,原來是這樣

辛苦工做一年,大大小小的公司或單位組織都會搞一個年會。年會少不了抽獎,每一個人都期待本身是抽中一等獎,然而現實是殘酷的,我今年也沒抽中,毛都沒中一根。這是爲何呢?咱們就來聊聊抽獎算法的那些事。 年會抽獎,按照形式,能夠分爲實物抓鬮和程序隨機算法。javascript

實物抓鬮

這個你們都知道,搞一個抽獎箱,每一個人入場的時候把本身的名字寫在紙條上,折起來,投入箱子裏就能夠。接下來你的命運就掌握在上臺抽獎的領導大佬們的手上了。抽獎一定是先從最差的末等獎開始抽,有些公司或單位組織是5等獎,有些直接三等獎,沒辦法,得留意預算。這種抽獎的狀況,若是主持人不搖一搖,而且排除領導同志喜歡海底撈的癖好,那麼越靠後投進箱子的朋友越容易被抽中。但是也別靠太后。我知道大家又想被抽中,又不想被早點抽中。若是三等獎就是一張電影券,你若被抽中,那還不如拿個楊光普照。反過來想一想,若是一家公司三等獎是一張電影票,你等到一等獎,也不會有什麼期待,或許是一把牙刷雷死你不償命。java

程序抓鬮

另一種形式,那就是程序抓鬮了。程序抓鬮,就是經過編寫一個電子抽獎程序,實現一個隨機算法,以科學的手段來抽獎。高大上的名字,有種科學算命的感受。咱們排除一下程序員主觀意願的做弊行爲,來思考一下他們寫的隨機算法到底公平不公平。通常電子抽獎的流程是,讓領導喊開始,隨便過一段時間後,領導再喊停。在這個過程當中,程序只有這兩個輸入控制命令。而且,爲了效果,通常都會在大屏幕隨機滾動一下各位參加抽獎同事們的頭像或名字什麼的。這裏就有兩個問題,滾動過程當中,到底選哪些頭像上大屏幕滾動?滾動結束後,如何隨機抽取n(n>1)箇中獎者,從哪裏抽?程序員

滾動過程的頭像選擇算法

假設參與抽獎者有大概1000名。每次大屏幕只能顯示頂多9名(九宮格,好看)。算法

懶漢程序員選擇算法

按照參與者簽到先來後到的順序排序,每次從前面按順序提取9名同事上牆。直到大佬喊停。這下好了。想露臉的同事們,趕忙早點去年會現場簽到吧。若是去晚了,就石沉大海,杳無音訊了。這樣寫的程序員確定是在想,1000名一次從數據庫中讀取出來,怕性能有問題,或者將就以前寫好的一個分頁接口,正好在這裏派上了用場。數據庫

勤奮程序員的選擇算法

他會用點心思想一想什麼叫公平。爲了省下那一點點性能,在抽獎前一次讀取全部1000名同事的頭像信息,以空間換取時間嘛。而後調用隨機數函數9次,按照9個隨機數的結果從集合裏抽取。抽取完後從集合中剔除,從新排序,總數做爲下一次的隨機範圍,直到大佬喊停。若是輪完一圈了,大佬玩心大起,還未喊停。那就把剔除的同事再次放入集合中,相似撲克洗牌。這裏的隨機函數稍微懂程序的朋友們,也就是利用了一些系統自帶的,好比javascriptrandom。這個好像稍微公平點吧?dom

當大佬終於喊停的時候,就開始啓動抽獎隨機算法,選擇中獎者了。雖然你上牆了,可是沒有被抽中,那有個屁用。因此關鍵仍是要看看程序員是如何實現抽獎算法的。即便沒上牆,也沒必要氣餒,有機會,就看你碰上了什麼樣的程序員。函數

沒有領證的程序員的抽獎算法

從前面上牆的參與者裏選擇n箇中獎者,n必須小於上牆者總數。碰上這樣的,仍是那句話,叫大家早點去年會現場,這下吃虧了吧?另外,有些領導就喜歡一開始就喊停,那大屏幕都還沒滾動一屏,因此,你更應該早點去現場了。性能

靠譜點的程序員的抽獎算法

首先他明白,待抽獎的集合千萬不能只從上牆集合裏抽取,那個僅僅是一個噱頭,相似籃球比賽暫停期間的拉拉隊表演而已。你見過有從啦啦隊成員裏選擇一個MVP嗎?因此,樣本空間仍是1000個參與者。其實也很簡單,利用系統隨機數,從1000範圍內抽取n個序號,按照序號找到中獎者就能夠了。這樣一來,甭管你是早來,仍是晚來,都不要緊了。google

前面說過,抽獎都是一輪一輪的抽的。因此,最起碼,確定要保證每抽完一輪,就要將這些中獎者從參與者中剔除。不然一我的運氣爆棚,祖墳冒青煙把全部獎都拿了,大家可別怪他做弊。code

隨機函數的內部算法?

這個我就很差多作論述了,我的能力有限,有興趣的朋友們,能夠去google一下,看看那個random方法,究竟是怎麼返回一個隨機數字的,它到底公平不公平。若是查到了的話,記得來這裏評論留言分享哦。

最後,祝兄弟姐妹們年會中大獎,千萬別碰到倒黴催的程序員和沒領證的程序員。

相關文章
相關標籤/搜索