基于js實現抽紅包并分配代碼實例
更新時間:2019年09月19日 11:38:43 作者:muamaker
這篇文章主要介紹了基于js實現抽紅包并分配代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
這篇文章主要介紹了基于js實現抽紅包并分配代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
將 50000元隨機分給10個人,其中3個人必須分到百位數,4個人分到千位數,3個人分到萬位數,每個人所得金額
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>Document</title>
</head>
<body>
將 50000元隨機分給10個人,其中3個人必須分到百位數,4個人分到千位數,3個人分到萬位數,每個人所得金額
</body>
<script type="text/javascript">
/**
*
* @param {Object} amount 總數錢
* @param {Object} list [2,2,2,3,3,3,3,4,4,4] 3個百位,4個千位,3個萬位
*/
//不要小數
function devide(amount,list){
var len = list.length;
//先計算所有的自身位數范圍
var arr = [];
for(var i = 0; i < len; i++){
var item = getRange(list[i]);
arr.push(item);
}
var res = [];
//只算n-1位,剩下最后一個,不用計算
for(var i = 0; i < len-1; i++){
var index = Math.floor(Math.random() * arr.length); //隨機獲取一個,然后用來取
var item = arr.splice(index,1)[0]; //取出當前需要發(fā)的紅包位數
var result = calc(amount,item,arr);
if(result){
res.push(result);
amount = amount - result;
}else{
return [];
}
}
if(arr[0].start > amount || arr[0].end < amount){
console.warn("分配出現錯誤,請重新規(guī)劃分配方案");
return [];
}
res.push(amount);
return res;
}
function calc(amount,item,arr){
//當其他的都取最小值時的總和,為了保證每個都分到
var otherRange = getOtherRange(arr);
var minStart = otherRange.countStart;
var maxEnd = otherRange.countEnd;
var mins = amount - minStart; //剩余可取
var end = item.end;
var start = item.start;
if(start > mins){
console.warn("分配出現錯誤,請重新規(guī)劃分配方案");
return false;
}else if(end > mins){
//如果最大范圍大于剩余的
end = mins;
}
//則隨機抽取從 start至end
var result = Math.floor(Math.random()*(end-start) + start);
if(amount - result > maxEnd){
//取的值太小,其他的取最大值也分不完
console.warn("分配出現錯誤,請重新規(guī)劃分配方案");
}
return result;
}
//獲取某位的范圍
function getRange(item){
return {
start:Math.pow(10,item), //比如百位2,這里最小就是100
end: Math.pow(10,item+1) - 1 //百位最大為 1000-1
}
}
//獲取所有的范圍
function getOtherRange(arr){
var countStart = 0;
var countEnd = 0;
for(var i = 0; i < arr.length; i++){
countStart += arr[i].start;
countEnd += arr[i].end;
}
return {
countStart,
countEnd
};
}
console.log(devide(50000,[2,2,2,3,3,3,3,4,4,4]))
</script>
</html>
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
JavaScript中Array實例方法filter的實現原理
filter() 方法創(chuàng)建一個新數組,其中包含通過所提供函數實現的測試的所有元素,本文將給大家介紹JavaScript中Array實例方法filter的實現原理,文中通過代碼示例講解的非常詳細,需要的朋友可以參考下2024-03-03
javascript使用中為什么10..toString()正常而10.toString()出錯呢
在JavaScript中為什么10..toString()正常,而10.toString()出錯呢?這個問題一直困擾著我,所抽時間搜集整理下,曬出來與大家分享感興趣的朋友可以了解下,希望對你們有幫助2013-01-01

