js實(shí)現(xiàn)指定紅包順序和金額算法
本文實(shí)例為大家分享了js實(shí)現(xiàn)指定紅包順序和金額的具體代碼,供大家參考,具體內(nèi)容如下
前言
- 朋友拜托而寫(xiě)
- 單個(gè)包最小金額為0.01
- 如果除指定金額外,其余都為0.01,最后尾包存在為0的幾率
- 本算法通過(guò)了1000000次測(cè)試,出錯(cuò)率為百萬(wàn)分之3
效果展示

空包問(wèn)題

紅包算法
/*
param: float, int, int, float
param1:紅包金額總額
param2:紅包數(shù)目
param3:指定特殊紅包
param4:指定特殊紅包金額
*/
let getPrize = function(total, number, index, volume){
let allowance = total - volume;
let arr = [];
let i = 0;
while(i < number - 2){
// 指定[0.01,allowance-(i*0.01))
let temp = (Math.random()*(allowance - (number - 1 - i) * 0.01) + 0.01).toFixed(2);
// if(temp < 0) console.log(`temp:${temp}`);
temp = temp <= 0 ? 0.01 : temp;
arr.push(parseFloat(temp));
allowance = parseFloat((allowance - temp).toFixed(2));
i++;
// console.log(`arr:${arr}, i:${i}`);
// 如果出現(xiàn)小于0的分配情況,剝削強(qiáng)者均分
if(allowance <= 0){
// console.log(`alowance:${allowance}`);
let w = arr.filter((val,index)=>{
// console.log(`val:${val}`);
if(val > 0.01){
arr[index] = parseFloat((arr[index] - 0.01).toFixed(2));
return val;
}
});
if(w.length == 0){
allowance = 0;
}else{
allowance = 0.01;
}
}
}
// 最后一個(gè)放入
arr.push(parseFloat(allowance.toFixed(2)));
let result = arr;
return result.slice(0, index).concat(parseFloat(volume), result.slice(index));
}
測(cè)試樣例
// Test sample
for(let m = 0; m < 10000; m++){
let total = (Math.random()*100 + 0.01).toFixed(2);
let number = Math.floor(Math.random()*20 +2);
while(total / number < 0.01){
number = Math.floor(Math.random()*20 +2);
}
let index = Math.floor(Math.random()*(number - 1));
let volume = (Math.random()*(total - 0.01*(number-1))+0.01).toFixed(2);
while(volume >= total || volume + 0.01*(number-1) > total){
// console.log(`xx:${volume}`);
volume = (Math.random()*(total - 0.01*(number-1))+0.01).toFixed(2);
volume = volume <= 0 ? 0.01 : volume;
}
let test = getPrize(total, number, index, volume);
// console.log(test);
let sum = test.reduce((total,val)=>total+=parseFloat(val));
sum = sum.toFixed(2);
if(sum !== total) {
console.log(`volume:${volume}, total: ${total}, number: ${number}`);
console.log(`sum:${sum}`);
console.log(test);
}
test.map((val,index)=>{
if(val <= 0 && index !== test.length - 1){
console.log(`volume:${volume}, total: ${total}, number: ${number}`);
console.log(`sum:${sum}`);
console.log(test);
}
});
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 利用JS實(shí)現(xiàn)二叉樹(shù)遍歷算法實(shí)例代碼
- 如何利用JavaScript實(shí)現(xiàn)排序算法淺析
- JavaScript編程通過(guò)Matlab質(zhì)心算法定位學(xué)習(xí)
- 面向JavaScript入門(mén)初學(xué)者的二叉搜索樹(shù)算法教程
- JavaScript實(shí)現(xiàn)的七種排序算法總結(jié)(推薦?。?/a>
- 淺談JavaScript構(gòu)造樹(shù)形結(jié)構(gòu)的一種高效算法
- 如何用JavaScript學(xué)習(xí)算法復(fù)雜度
- 如何利用javascript做簡(jiǎn)單的算法
相關(guān)文章
關(guān)于前后端json數(shù)據(jù)的發(fā)送與接收詳解
這篇文章主要給大家介紹了關(guān)于前后端json數(shù)據(jù)發(fā)送與接收的相關(guān)資料,文中通過(guò)示例代碼詳細(xì)介紹了關(guān)于flask中的json數(shù)據(jù)接收和前端發(fā)送json數(shù)據(jù)等內(nèi)容,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-07-07
返回上一頁(yè)并自動(dòng)刷新的JavaScript代碼
返回上一頁(yè)并自動(dòng)刷新,JavaScript一般的使用history.go(-1)和history.back()等,需要的朋友可以參考下2014-02-02
JavaScript反彈動(dòng)畫(huà)效果的實(shí)現(xiàn)代碼
本文通過(guò)實(shí)例代碼給大家介紹了js反彈動(dòng)畫(huà)效果的實(shí)現(xiàn)代碼,需要的朋友參考下吧2017-07-07
JavaScript 判斷對(duì)象中是否有某屬性的常用方法
判斷對(duì)象中是否有某屬性的常見(jiàn)方式總結(jié),不同的場(chǎng)景要使用不同的方式。這篇文章給大家介紹了JavaScript 判斷對(duì)象中是否有某屬性的常用方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2018-06-06
Javascript執(zhí)行流程細(xì)節(jié)原理解析
這篇文章主要介紹了Javascript執(zhí)行流程細(xì)節(jié)解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05
js獲取客戶(hù)端網(wǎng)卡的IP地址、MAC地址
這篇文章主要介紹了js獲取客戶(hù)端網(wǎng)卡的IP地址、MAC地址的方法,需要的朋友可以參考下2014-03-03
微信小程序的宿主環(huán)境實(shí)現(xiàn)代碼
這篇文章主要介紹了微信小程序的宿主環(huán)境,包括scroll-view 組件的基本使用,text 組件的基本使用及rich-text 組件的基本使用,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-10-10

