前段時(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ì)算算法分離。
下面是我想到的兩種抽獎(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)看看。