国产成人精品亚洲777人妖,欧美日韩精品一区视频,最新亚洲国产,国产乱码精品一区二区亚洲

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

JS根據(jù)獎(jiǎng)品權(quán)重計(jì)算中獎(jiǎng)概率

瀏覽:125日期:2024-03-28 10:28:00
一、示例場(chǎng)景1.1、設(shè)置抽獎(jiǎng)活動(dòng)的獎(jiǎng)項(xiàng)名稱(chē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)文章!

標(biāo)簽: JavaScript
相關(guān)文章:
主站蜘蛛池模板: 麟游县| 清苑县| 佛教| 通道| 益阳市| 永春县| 泾阳县| 临沧市| 定边县| 邵阳县| 中西区| 临邑县| 浦北县| 南昌市| 广宁县| 福海县| 榆树市| 甘南县| 婺源县| 肃北| 班玛县| 娄烦县| 嘉峪关市| 南宫市| 瑞安市| 石台县| 南溪县| 乐至县| 稷山县| 乐都县| 龙泉市| 洛扎县| 宁强县| 舒城县| 仲巴县| 英德市| 东阿县| 旺苍县| 连江县| 北川| 商丘市|