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)文章
如何在vscode中使用Typescript并運(yùn)行詳解
在VSCode中編寫(xiě)的TypeScript代碼不能直接運(yùn)行,需要先用tsc編譯為JavaScript,然后才能運(yùn)行,下面這篇文章主要給大家介紹了關(guān)于如何在vscode中使用Typescript并運(yùn)行的相關(guān)資料,需要的朋友可以參考下2023-05-05
javascript比較兩個(gè)日期相差天數(shù)的方法
這篇文章主要介紹了javascript比較兩個(gè)日期相差天數(shù)的方法,涉及javascript針對(duì)日期的轉(zhuǎn)換與數(shù)學(xué)運(yùn)算相關(guān)技巧,非常簡(jiǎn)單實(shí)用,需要的朋友可以參考下2015-07-07
Bootstrap 3 按鈕標(biāo)簽實(shí)例代碼
這篇文章主要介紹了Bootstrap 3 按鈕標(biāo)簽實(shí)例代碼,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-02-02
await/async無(wú)法捕獲與處理錯(cuò)誤信息的解決方案分享
async await 中添加錯(cuò)誤處理個(gè)人認(rèn)為是有必要的,下面這篇文章主要給大家介紹了關(guān)于await/async無(wú)法捕獲與處理錯(cuò)誤信息的解決方案,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02
仿163填寫(xiě)郵件地址自動(dòng)顯示下拉(無(wú)優(yōu)化)
本框內(nèi)填個(gè)1,這些值都寫(xiě)在隱藏域了。代碼里可以看到,用戶輸入包含在里面的時(shí)候,可以按ENTER鍵選中.2008-11-11
通過(guò)JAVASCRIPT讀取ASP設(shè)定的COOKIE
通過(guò)JAVASCRIPT讀取ASP設(shè)定的COOKIE...2006-11-11
javascript中檢測(cè)變量的類(lèi)型的代碼
javascript對(duì)于變量的定義、類(lèi)型的要求都比較松散,這樣既方便,但又容易犯錯(cuò)。有時(shí)候進(jìn)行必要的類(lèi)型檢查是必須的。2010-12-12
avalonjs實(shí)現(xiàn)仿微博的圖片拖動(dòng)特效
JavaScript實(shí)現(xiàn)仿微博的圖片拖動(dòng)特效,貌似這些天有不少朋友需要這功能,今天發(fā)現(xiàn)這款是js制作的好,不敢獨(dú)享,希望需要的朋友喜歡哦。2015-05-05
Electron中關(guān)于靜態(tài)資源加載問(wèn)題的解決方案
通常,我們?cè)谑褂胑lectron框架的時(shí)候會(huì)使用到loadFile/loadURL進(jìn)行頁(yè)面的加載,分別是加載本地文件和加載網(wǎng)絡(luò)文件,當(dāng)nuxtjs/nextjs想引入到electron中顯示時(shí),你會(huì)遇到資源路徑引用的問(wèn)題,所以本文給大家介紹了Electron中關(guān)于靜態(tài)資源加載問(wèn)題的解決方案2024-12-12

