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]; //取出当前需要发的红包位数
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("分配出现错误,请重新规划分配方案");
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("分配出现错误,请重新规划分配方案");
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("分配出现错误,请重新规划分配方案");
} 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>
js抽红包分配的更多相关文章
- java实现微信红包分配算法
红包算法分析 有人认为,抢红包的额度是从0.01到剩余平均值*N(N是一个系数,决定最大的红包值)之间,比如一共发了10块钱,发了10个红包:第一个人可以拿到(0.01~1*N)之间的一个红包值,当然 ...
- 研究微信红包分配算法之Golang版
今天来看一下红包的分配,参考几年前流传的微信红包分配算法,今天用Golang实现一版,并测试验证结果. 微信红包的随机算法是怎样实现的?https://www.zhihu.com/question/2 ...
- js 发红包
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...
- 如何用 js 实现一个类似微信红包的随机算法
如何用 js 实现一个类似微信红包的随机算法 js, 微信红包, 随机算法 "use strict"; /** * * @author xgqfrms * @license MIT ...
- C#开发微信门户及应用(38)--微信摇一摇红包功能
摇一摇周边红包接口是为线下商户提供的发红包功能.用户可以在商家门店等线下场所通过摇一摇周边领取商家发放的红包.我曾经在<C#开发微信门户及应用(28)--微信“摇一摇·周边”功能的使用和接口的实 ...
- 使用PHP编写发红包程序
使用PHP编写发红包程序 http://www.jb51.net/article/69815.htm 投稿:hebedich 字体:[增加 减小] 类型:转载 时间:2015-07-22 微信发红 ...
- Python微信红包算法
sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频) https://study.163.com/course/introduction.htm?courseId=1005269003& ...
- python 微信红包生成器
#红包生成思路#200 块钱 10个红包#0-200 的一个轴,随机取9个点,分成10段, 每一段的值表示一个红包的大小 #把输入的 money值 * 100 拿到的数值就是分, 不用再考虑单位是元的 ...
- PHP+Ajax手机移动端发红包实例
基本流程:当输入完红包数量和总金额后,PHP会根据这两个值进行随机分配每个金额,保证每个人都能领取到一个红包,且每个红包金额不等,并且所有红包金额总额等于总金额. 实现原理:设定总金额为10元,有N个 ...
随机推荐
- Android必学-异步加载+Android自定义View源码【申明:来源于网络】
Android必学-异步加载+Android自定义View源码[申明:来源于网络] 异步加载地址:http://download.csdn.net/detail/u013792369/8867609 ...
- asp.net 访问页面访问统计实现
0x00.背景: 1.用户访问网站所有页面就将访问统计数加1 ,按每月存放. 2.站点并没有用到母版面来实现,所有各个页面都很独立. 3.网站是很早这前的网站,尽量省改动以前的代码.按理说我们应该做一 ...
- 英语专业出身也要走向python
这两年一直徘徊在学习python和放弃python的道路上不断的徘徊,今年终于没有在蹉跎下去,选择了开始新的自我挑战,零基础开始学习python. 作为一名英语专业毕业的文科生,学习编程还是相对有些困 ...
- .NET Core 2.2发布一览
本周终于发布了.NET Core 2.2,ASP.NET Core 2.2以及Entity Framework Core 2.2,虽然更大的新闻可能是.NET Core 3.0的特性公布,但不妨先将现 ...
- 使用Zookeeper命令的简单操作步骤
(1) 使用ls命令查看当前Zookeeper中所包含的内容:ls / [zk: localhost:2181(CONNECTED) 1] ls / [zookeeper] [zk: localhos ...
- readonly enable
<input type="text" id="UserName" style="width:20%;" disabled=" ...
- 运行或开发.NET Core 的先决条件(支持项目、依赖项)
Windows 上 .NET Core 的先决条件 https://docs.microsoft.com/zh-cn/dotnet/core/windows-prerequisites?tabs=ne ...
- Page10:Lyapunov稳定概念及判定定理[Linear System Theory]
内容包含连续和离散系统的Lyapunov稳定概念及其各种判别定理
- oracle执行计划相关
执行计划相关 根据Operation缩进来判断,缩进最多的最先执行:(缩进相同时,最上面的最先执行) 同一级如果某个动作没有子ID就最先执行 同一级的动作执行时遵循最上最右先执行的原则 TABLE A ...
- 使用U盘为虚拟机安装系统
前提:使用虚拟机安装WIN8系统时,由于WIN8镜像文件大于4G无法使用虚拟安装,所以使用U盘安装. 1.装有U盘启动的WINPe系统 (1)下载 老毛桃U盘启动盘制作工具 (2)U盘清空 2.虚拟机 ...