JS根據(jù)獎(jiǎng)品權(quán)重計(jì)算中獎(jiǎng)概率
獎(jiǎng)項(xiàng)名稱(chēng):['一等獎(jiǎng)', '二等獎(jiǎng)', '三等獎(jiǎng)', '未中獎(jiǎng)']。假設(shè)抽獎(jiǎng)活動(dòng)設(shè)置了這四個(gè)獎(jiǎng)項(xiàng),當(dāng)然開(kāi)發(fā)者可以擴(kuò)展更多。
var prizes = ['一等獎(jiǎng)','二等獎(jiǎng)','三等獎(jiǎng)','未中獎(jiǎng)']; //獎(jiǎng)項(xiàng)名稱(chēng)數(shù)組1.2、設(shè)置各獎(jiǎng)項(xiàng)權(quán)重
獎(jiǎng)項(xiàng)權(quán)重:[1, 5, 20, 74]。獎(jiǎng)項(xiàng)權(quán)重主要用來(lái)表征各獎(jiǎng)項(xiàng)的中獎(jiǎng)幾率,這里獎(jiǎng)項(xiàng)權(quán)重?cái)?shù)組的和值為100(=1+5+20+74),其中1表示一等獎(jiǎng)的中獎(jiǎng)概率為1%;5表示一等獎(jiǎng)的中獎(jiǎng)概率為5%;20表示三等獎(jiǎng)的中獎(jiǎng)概率為20%;最后剩下的74表示未中獎(jiǎng)的概率為74%。
var prizeWeight = [1, 5, 20, 74]; //獎(jiǎng)項(xiàng)權(quán)重?cái)?shù)組,表征各獎(jiǎng)項(xiàng)的中獎(jiǎng)機(jī)會(huì)占總數(shù)的百分比。比如一等獎(jiǎng)的中獎(jiǎng)率是1%,二等獎(jiǎng)的中獎(jiǎng)率是5%
如果抽獎(jiǎng)活動(dòng)設(shè)置的獎(jiǎng)項(xiàng)更多,開(kāi)發(fā)者也可以相應(yīng)擴(kuò)展權(quán)重?cái)?shù)組的和值,比如權(quán)重和值為500,1000等,并相應(yīng)設(shè)置數(shù)組元素來(lái)表征每抽500次,可中多少次、什么等級(jí)的獎(jiǎng)項(xiàng)。
另外,開(kāi)發(fā)者也可以將獎(jiǎng)項(xiàng)名稱(chēng)與獎(jiǎng)項(xiàng)權(quán)重?cái)?shù)組合并聲明在一個(gè)對(duì)象中:
//設(shè)置獎(jiǎng)項(xiàng)名稱(chēng)、權(quán)重等數(shù)組var prizes = [ {'name': '一等獎(jiǎng)', 'weight': 1}, {'name': '二等獎(jiǎng)', 'weight': 5}, {'name': '三等獎(jiǎng)', 'weight': 20}, {'name': '未中獎(jiǎng)', 'weight': 74}];1.3、抽獎(jiǎng)活動(dòng)規(guī)則 0 < 本次抽獎(jiǎng)隨機(jī)數(shù) <= 1,表示抽中一等獎(jiǎng); 1 < 本次抽獎(jiǎng)隨機(jī)數(shù) <= 5,表示抽中二等獎(jiǎng); 5 < 本次抽獎(jiǎng)隨機(jī)數(shù) <= 20,表示抽中三等獎(jiǎng); 本次抽獎(jiǎng)隨機(jī)數(shù) > 20,表示未中獎(jiǎng)。二、實(shí)現(xiàn)原理
因?yàn)楸疚氖呛?jiǎn)單實(shí)現(xiàn),本抽獎(jiǎng)程序的原理也設(shè)計(jì)得較為簡(jiǎn)單:
根據(jù)權(quán)重?cái)?shù)組的和值(weightSum),在每次抽獎(jiǎng)時(shí)生成一個(gè)權(quán)重隨機(jī)數(shù)(weightRandom),這個(gè)權(quán)重隨機(jī)數(shù)(weightRandom)是介于 0-weightSum (權(quán)重和值)之間的,本文示例設(shè)置的權(quán)重?cái)?shù)組和值為100,表示生成的權(quán)重隨機(jī)數(shù)是介于 0-100 之間的; 然后讓這個(gè)權(quán)重隨機(jī)數(shù)(weightRandom)去和權(quán)重?cái)?shù)組中的所有元素值作比較,計(jì)算這個(gè)權(quán)重隨機(jī)數(shù)(weightRandom)位于哪兩個(gè)獎(jiǎng)項(xiàng)之間,符合哪條中獎(jiǎng)規(guī)則,對(duì)應(yīng)哪個(gè)獎(jiǎng)項(xiàng)名稱(chēng)。比如:某次抽獎(jiǎng)生成的權(quán)重隨機(jī)數(shù)(weightRandom)為15.15,按照 1.3 的活動(dòng)規(guī)則,因?yàn)?5 <15.15<= 20,表示此次生成的權(quán)重隨機(jī)數(shù)(weightRandom)可中三等獎(jiǎng)。
下面分別來(lái)實(shí)現(xiàn):
2.1、計(jì)算權(quán)重和值//數(shù)組累加求和函數(shù):Array.reduce(function(prev ,cuurentValue), initialValue)var weightSum = prizeWeight.reduce(function(prev, currVal){ //計(jì)算權(quán)重之和:1+5+20+74=100 return prev + currVal; //prev 是前一次累加后的數(shù)值,currVal 是本次待加的數(shù)值}, 0);2.2、編寫(xiě)抽獎(jiǎng)函數(shù)
根據(jù)權(quán)重和值 weightSum,生成介于0-weightSum之間的權(quán)重隨機(jī)數(shù)
//抽獎(jiǎng)函數(shù)var lottery = function(weightSum) { var res = '未中獎(jiǎng)'; //默認(rèn)設(shè)置抽獎(jiǎng)結(jié)果為“未中獎(jiǎng)” console.log('本程序的獎(jiǎng)項(xiàng)權(quán)重和值:', weightSum);//生成一個(gè)權(quán)重隨機(jī)數(shù),介于0-weightSum之間 var random = Math.random()*weightSum; //生成一個(gè)權(quán)重隨機(jī)數(shù)(0 到 weightSum 之間) console.log('本次抽獎(jiǎng)的權(quán)重隨機(jī)數(shù):', random);//權(quán)重?cái)?shù)組重組并排序 var concatWeightArr = prizeWeight.concat(random); //將隨機(jī)數(shù)加入權(quán)重?cái)?shù)組 var sortedWeightArr = concatWeightArr.sort(function(a, b){return a-b;}); //將包含隨機(jī)數(shù)的新權(quán)重?cái)?shù)組按從小到大(升序)排序 console.log('含權(quán)重隨機(jī)數(shù)的新權(quán)重?cái)?shù)組升序排序后:', sortedWeightArr);//索引權(quán)重隨機(jī)數(shù)的數(shù)組下標(biāo) var randomIndex = sortedWeightArr.indexOf(random); //索引隨機(jī)數(shù)在新權(quán)重?cái)?shù)組中的位置 randomIndex = Math.min(randomIndex, prizes.length -1); //權(quán)重隨機(jī)數(shù)的下標(biāo)不得超過(guò)獎(jiǎng)項(xiàng)數(shù)組的長(zhǎng)度-1,重新計(jì)算隨機(jī)數(shù)在獎(jiǎng)項(xiàng)數(shù)組中的索引位置 console.log('本次權(quán)重隨機(jī)數(shù)對(duì)應(yīng)的數(shù)組下標(biāo):', randomIndex);//取出對(duì)應(yīng)獎(jiǎng)項(xiàng) res = prizes[randomIndex]; //從獎(jiǎng)項(xiàng)數(shù)組中取出本次抽獎(jiǎng)結(jié)果 console.log('本次抽獎(jiǎng)結(jié)果:', res);return {'weightSum': weightSum , 'weightRandom': random, prizeIndex: randomIndex, 'data': res}; //返回本次抽獎(jiǎng)結(jié)果};
需要說(shuō)明的是:
(1)在抽獎(jiǎng)函數(shù)中,首先生成一個(gè)權(quán)重隨機(jī)數(shù)(random),然后將這個(gè)權(quán)重隨機(jī)數(shù)(random)與原權(quán)重?cái)?shù)組合并(使用 Array.concat() 函數(shù),返回值是一個(gè)新數(shù)組,原權(quán)重?cái)?shù)組不變),生成一個(gè)新權(quán)重?cái)?shù)組,并將新權(quán)重?cái)?shù)組按照數(shù)值從小到大(升序)來(lái)排序(使用 Array.sort() 函數(shù));這樣,權(quán)重隨機(jī)數(shù)(random)按照大小順序,就會(huì)落在某兩個(gè)獎(jiǎng)項(xiàng)權(quán)重?cái)?shù)值之間。最后索引權(quán)重隨機(jī)數(shù)(random)在新權(quán)重?cái)?shù)組中的下標(biāo),就可以取出對(duì)應(yīng)的獎(jiǎng)項(xiàng)名稱(chēng)數(shù)組中的元素。
(2)比如:某次抽獎(jiǎng)函數(shù)生成的權(quán)重隨機(jī)數(shù)為15.15,與原來(lái)的權(quán)重?cái)?shù)組:[1, 5, 20, 74] 合并,并排序,將得到新權(quán)重?cái)?shù)組:[1, 5,15.15,20, 74],權(quán)重隨機(jī)數(shù)(15.15)落在 5-20 之間,權(quán)重隨機(jī)數(shù)(15.15)在新權(quán)重?cái)?shù)組中的下標(biāo)是 2,對(duì)應(yīng)取出獎(jiǎng)項(xiàng)名稱(chēng)數(shù)組下標(biāo)為 2 的元素:prizes[2] = '三等獎(jiǎng)'。由此判斷本次抽獎(jiǎng)可中三等獎(jiǎng)。
(3)在抽獎(jiǎng)函數(shù)中,為了確定權(quán)重隨機(jī)數(shù)(random)的大小對(duì)應(yīng)何種獎(jiǎng)項(xiàng)時(shí),即比較權(quán)重隨機(jī)數(shù)與權(quán)重?cái)?shù)組中各元素?cái)?shù)值的大小時(shí),編者沒(méi)有使用傳統(tǒng)的 for 循環(huán)來(lái)遍歷比較權(quán)重隨機(jī)數(shù)(random)與 prizeWeight 數(shù)組中各元素的大小,而是合并生成新的權(quán)重?cái)?shù)組并排序,再使用 Array.indexOf() 函數(shù)來(lái)索引權(quán)重隨機(jī)數(shù)(random)的下標(biāo),這個(gè)下標(biāo)對(duì)應(yīng)的獎(jiǎng)項(xiàng)名稱(chēng)也就取出了。
三、項(xiàng)目完整代碼本示例項(xiàng)目js部分核心代碼:
//layui 模塊化引用layui.use([’jquery’, ’util’], function(){ var $ = layui.$, util = layui.util;//設(shè)置獎(jiǎng)項(xiàng)名稱(chēng)、權(quán)重、中獎(jiǎng)次數(shù)等數(shù)組 var prizes = ['一等獎(jiǎng)', '二等獎(jiǎng)', '三等獎(jiǎng)', '未中獎(jiǎng)']; //獎(jiǎng)項(xiàng)名稱(chēng)數(shù)組 var prizeWeight = [1, 5, 20, 74]; //獎(jiǎng)項(xiàng)權(quán)重?cái)?shù)組,表征各獎(jiǎng)項(xiàng)的中獎(jiǎng)機(jī)會(huì)占總數(shù)的百分比。比如一等獎(jiǎng)的中獎(jiǎng)率是1%,二等獎(jiǎng)的中獎(jiǎng)率是5% //開(kāi)發(fā)者也可合并聲明獎(jiǎng)項(xiàng)名稱(chēng)、權(quán)重等數(shù)組在一個(gè)對(duì)象中 //var prizes = [ // {'name': '一等獎(jiǎng)', 'weight': 1}, // {'name': '二等獎(jiǎng)', 'weight': 5}, // {'name': '三等獎(jiǎng)', 'weight': 20}, // {'name': '未中獎(jiǎng)', 'weight': 74} //];//數(shù)組累加求和函數(shù):Array.reduce(function(prev ,cuurentValue), initialValue) var weightSum = prizeWeight.reduce(function(prev, currVal){ //計(jì)算權(quán)重之和:1+5+20+74=100return prev + currVal; //prev 是前一次累加后的數(shù)值,currVal 是本次待加的數(shù)值 }, 0); document.getElementById('weightSum').innerhtml = weightSum; //設(shè)置權(quán)重和值//抽獎(jiǎng)函數(shù) var lottery = function(weightSum) {var res = '未中獎(jiǎng)'; //默認(rèn)設(shè)置抽獎(jiǎng)結(jié)果為“未中獎(jiǎng)”console.log('本程序的獎(jiǎng)項(xiàng)權(quán)重和值:', weightSum);//生成一個(gè)權(quán)重隨機(jī)數(shù),介于0-weightSum之間var random = Math.random()*weightSum; //生成一個(gè)權(quán)重隨機(jī)數(shù)(0 到 weightSum 之間)console.log('本次抽獎(jiǎng)的權(quán)重隨機(jī)數(shù):', random);//權(quán)重?cái)?shù)組重組并排序var concatWeightArr = prizeWeight.concat(random); //將隨機(jī)數(shù)加入權(quán)重?cái)?shù)組var sortedWeightArr = concatWeightArr.sort(function(a, b){return a-b;}); //將包含隨機(jī)數(shù)的新權(quán)重?cái)?shù)組按從小到大(升序)排序console.log('含權(quán)重隨機(jī)數(shù)的新權(quán)重?cái)?shù)組升序排序后:', sortedWeightArr);//索引權(quán)重隨機(jī)數(shù)的數(shù)組下標(biāo)var randomIndex = sortedWeightArr.indexOf(random); //索引隨機(jī)數(shù)在新權(quán)重?cái)?shù)組中的位置randomIndex = Math.min(randomIndex, prizes.length -1); //權(quán)重隨機(jī)數(shù)的下標(biāo)不得超過(guò)獎(jiǎng)項(xiàng)數(shù)組的長(zhǎng)度-1,重新計(jì)算隨機(jī)數(shù)在獎(jiǎng)項(xiàng)數(shù)組中的索引位置console.log('本次權(quán)重隨機(jī)數(shù)對(duì)應(yīng)的數(shù)組下標(biāo):', randomIndex);//取出對(duì)應(yīng)獎(jiǎng)項(xiàng)res = prizes[randomIndex]; //從獎(jiǎng)項(xiàng)數(shù)組中取出本次抽獎(jiǎng)結(jié)果console.log('本次抽獎(jiǎng)結(jié)果:', res);return {'weightSum': weightSum , 'weightRandom': random, prizeIndex: randomIndex, 'data': res}; //返回本次抽獎(jiǎng)結(jié)果 }; //注冊(cè)按鈕事件 $(’.layui-btn[data-type='save']’).on(’click’, function () {var res = lottery(weightSum);document.getElementById('dateNow').innerhtml = util.toDateString(new Date()); //輸出本次抽獎(jiǎng)時(shí)間document.getElementById('weightRandom').innerHTML = res.weightRandom; //輸出本次抽獎(jiǎng)的權(quán)重隨機(jī)數(shù)document.getElementById('printData').innerHTML = res.data; //輸出本次抽獎(jiǎng)結(jié)果//重置中獎(jiǎng)規(guī)則文字的字體顏色 $(’.rule-body>p’).css('color', 'inherit');$(’.rule-body>p:eq(’ + res.prizeIndex + ’)’).css('color', 'red'); });});
以上就是JS根據(jù)獎(jiǎng)品權(quán)重計(jì)算中獎(jiǎng)概率的詳細(xì)內(nèi)容,更多關(guān)于JS計(jì)算中獎(jiǎng)概率的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!
相關(guān)文章:
1. CSS可以做的幾個(gè)令你嘆為觀(guān)止的實(shí)例分享2. 詳解CSS偽元素的妙用單標(biāo)簽之美3. 小技巧處理div內(nèi)容溢出4. 低版本IE正常運(yùn)行HTML5+CSS3網(wǎng)站的3種解決方案5. XML入門(mén)精解之結(jié)構(gòu)與語(yǔ)法6. 詳解瀏覽器的緩存機(jī)制7. 概述IE和SQL2k開(kāi)發(fā)一個(gè)XML聊天程序8. HTML5 Canvas繪制圖形從入門(mén)到精通9. XHTML 1.0:標(biāo)記新的開(kāi)端10. XML入門(mén)的常見(jiàn)問(wèn)題(二)
