微信大轉(zhuǎn)盤(pán)抽獎(jiǎng)獎(jiǎng)項(xiàng)概率算法分析

前段時(shí)間公司里為了推廣微信公眾號(hào)吸粉,需要在公眾號(hào)菜單里增加一個(gè)大轉(zhuǎn)盤(pán)抽獎(jiǎng)的活動(dòng),在活動(dòng)現(xiàn)場(chǎng)手機(jī)上抽到什么獎(jiǎng)品就是什么,當(dāng)然由于部分獎(jiǎng)品的數(shù)量有限,所以需要對(duì)每個(gè)獎(jiǎng)項(xiàng)設(shè)置中獎(jiǎng)概率,根據(jù)每個(gè)獎(jiǎng)品的份數(shù)來(lái)設(shè)置中獎(jiǎng)概率。但是前端給游客看到的轉(zhuǎn)盤(pán)里不能顯示有概率大小之分,要讓游客感覺(jué)到每個(gè)獎(jiǎng)品的概率都是一樣的,這樣就需要將轉(zhuǎn)盤(pán)的渲染和中獎(jiǎng)計(jì)算算法分離。

微信大轉(zhuǎn)盤(pán)

下面是我想到的兩種抽獎(jiǎng)獎(jiǎng)項(xiàng)概率的算法,兩種算法各有利弊,需要結(jié)合實(shí)際情況來(lái)看選擇哪種。

算法一
第一種算法是通過(guò)設(shè)置一個(gè)數(shù)組設(shè)定每個(gè)獎(jiǎng)項(xiàng)對(duì)應(yīng)的數(shù)量,生成范圍區(qū)間,然后計(jì)算出總數(shù)量,通過(guò)在0~總數(shù)量中生成隨機(jī)數(shù)來(lái)判斷當(dāng)前生成的隨機(jī)數(shù)是在哪個(gè)區(qū)間范圍內(nèi),就此來(lái)判斷出對(duì)應(yīng)的獎(jiǎng)項(xiàng)。
這種算法的好處是在整個(gè)過(guò)程中,每一次的抽獎(jiǎng)各獎(jiǎng)項(xiàng)概率都是相同的,保證了抽獎(jiǎng)的公平性,缺點(diǎn)是如果最大概率的獎(jiǎng)品抽完了,根據(jù)概率論原理,之后會(huì)出現(xiàn)一直抽到但獎(jiǎng)品沒(méi)有的情況,所以這種算法適用于高概率獎(jiǎng)品數(shù)量大于參與人數(shù)的情況。
下面是這種算法的具體代碼

//動(dòng)態(tài)添加大轉(zhuǎn)盤(pán)的獎(jiǎng)品與獎(jiǎng)品區(qū)域背景顏色和數(shù)量
turnplate.restaraunts = ["卡套", "面巾紙","寶珠筆","卡通風(fēng)扇","護(hù)照夾","便攜鏡"];
turnplate.colors = ["#FFF4D6", "#FFFFFF", "#FFF4D6", "#FFFFFF", "#FFF4D6", "#FFFFFF"];
turnplate.rate = [799,100,20,39,50,25];
//獲取隨機(jī)數(shù)(獎(jiǎng)品個(gè)數(shù)范圍內(nèi))
var maxlength = 0;
for(var i in turnplate.rate){
    maxlength += turnplate.rate[i];
}
var item = '';
var rate_item = rnd(0,maxlength);
//判斷當(dāng)前隨機(jī)數(shù)在哪個(gè)范圍內(nèi)
var startI = 0;
var endI = 1;
for(var i in turnplate.rate){
    endI = endI + turnplate.rate[i];
    if(rate_item > startI && rate_item < endI){
        item = (Number(i)+1);
    }
    startI = startI + turnplate.rate[i];
}

算出獎(jiǎng)品序號(hào)item之后,根據(jù)item計(jì)算對(duì)應(yīng)的轉(zhuǎn)盤(pán)角度,實(shí)現(xiàn)動(dòng)畫(huà)效果后將轉(zhuǎn)盤(pán)指針停在計(jì)算出的角度內(nèi)即可。

算法二
第二種算法是需要后端服務(wù)器支持的,在游客抽獎(jiǎng)之后通過(guò)異步操作在后端數(shù)據(jù)庫(kù)生成一條獎(jiǎng)品記錄,在下次抽獎(jiǎng)時(shí)計(jì)算數(shù)據(jù)庫(kù)中的獎(jiǎng)品記錄數(shù),如果已抽取的獎(jiǎng)品記錄數(shù)/總記錄數(shù)大于等于該獎(jiǎng)品的概率,則抽獎(jiǎng)代碼需執(zhí)行continue操作直到抽到小于獎(jiǎng)品概率的獎(jiǎng)項(xiàng)為止。這種算法的好處是可以保證獎(jiǎng)品的數(shù)量,如果獎(jiǎng)品沒(méi)有了,那么就到了該獎(jiǎng)品的概率峰值,就不會(huì)再抽到該獎(jiǎng)品。這種算法的缺點(diǎn)是越前面抽的人中大獎(jiǎng)的概率越高,越到后面概率逐漸趨于獎(jiǎng)品的實(shí)際概率,存在一定的不公平性。這種算法一般適用于對(duì)于獎(jiǎng)品的份數(shù)小于抽獎(jiǎng)人數(shù)的情況,就是獎(jiǎng)品都要發(fā)完的情況。

第二種算法的具體代碼實(shí)現(xiàn)比較簡(jiǎn)單,這里就不具體列出了,有興趣的同學(xué)可以自己實(shí)現(xiàn)看看。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 一般的抽獎(jiǎng)管理功能,基本是在一個(gè)獎(jiǎng)池中放一堆獎(jiǎng)品,分別給它們?cè)O(shè)置不同的數(shù)量和概率,在獎(jiǎng)品沒(méi)有發(fā)完的情況下,...
    wwking閱讀 10,310評(píng)論 3 16
  • 一般的抽獎(jiǎng)管理功能,基本是在一個(gè)獎(jiǎng)池中放一堆獎(jiǎng)品,分別給它們?cè)O(shè)置不同的數(shù)量和概率,在獎(jiǎng)品沒(méi)有發(fā)完的情況下,概...
    wwking02閱讀 3,951評(píng)論 1 4
  • 抽獎(jiǎng)程序設(shè)定的算法:把設(shè)定的中獎(jiǎng)概率從小到大排序(0.1、0.15、0.25、0.5),劃分區(qū)間([0,0...
    wwking閱讀 23,276評(píng)論 3 17
  • 最近的一個(gè)業(yè)務(wù)需求是開(kāi)發(fā)一個(gè)抽獎(jiǎng)管理功能,要求在一個(gè)獎(jiǎng)池中放一堆獎(jiǎng)品,分別給它們?cè)O(shè)置不同的數(shù)量和概率,在獎(jiǎng)品沒(méi)有發(fā)...
    codemarker閱讀 23,106評(píng)論 2 12
  • 2017/8/6 1.人類(lèi)為什么要睡覺(jué)? 2.不睡覺(jué)可以嗎? 不斷爆棚就可以! 3.為什么睡覺(jué)會(huì)做夢(mèng)? 4.做夢(mèng)...
    扶搖萬(wàn)事屋閱讀 346評(píng)論 2 1