• 售前

  • 售后

热门帖子
入门百科

js实现指定红包序次和金额算法

[复制链接]
悲新座客 显示全部楼层 发表于 2021-10-26 13:19:37 |阅读模式 打印 上一主题 下一主题
本文实例为各人分享了js实现指定红包次序和金额的具体代码,供各人参考,具体内容如下
前言

       
  • 朋侪拜托而写   
  • 单个包最小金额为0.01   
  • 如果除指定金额外,其余都为0.01,末了尾包存在为0的几率   
  • 本算法通过了1000000次测试,出错率为百万分之3
结果展示


空包问题


红包算法
  1. /*
  2.     param: float, int, int, float
  3.     param1:红包金额总额
  4.     param2:红包数目
  5.     param3:指定特殊红包
  6.     param4:指定特殊红包金额
  7. */
  8. let getPrize = function(total, number, index, volume){
  9.     let allowance = total - volume;
  10.     let arr = [];
  11.     let i = 0;
  12.     while(i < number - 2){
  13.         // 指定[0.01,allowance-(i*0.01))
  14.         let temp = (Math.random()*(allowance - (number - 1 - i) * 0.01) + 0.01).toFixed(2);
  15.         // if(temp < 0)    console.log(`temp:${temp}`);
  16.         temp = temp <= 0 ? 0.01 : temp;        
  17.         arr.push(parseFloat(temp));
  18.         allowance = parseFloat((allowance - temp).toFixed(2));        
  19.         i++;
  20.         // console.log(`arr:${arr}, i:${i}`);
  21.         // 如果出现小于0的分配情况,剥削强者均分
  22.         if(allowance <= 0){
  23.             // console.log(`alowance:${allowance}`);
  24.             
  25.             
  26.             let w = arr.filter((val,index)=>{
  27.                 // console.log(`val:${val}`);
  28.                 if(val > 0.01){
  29.                     
  30.                     arr[index] = parseFloat((arr[index] - 0.01).toFixed(2));
  31.                     return val;
  32.                 }
  33.             });
  34.             if(w.length == 0){
  35.                 allowance = 0;
  36.             }else{
  37.                 allowance = 0.01;
  38.             }
  39.             
  40.         }
  41.     }
  42.     // 最后一个放入
  43.     arr.push(parseFloat(allowance.toFixed(2)));
  44.     let result = arr;
  45.     return result.slice(0, index).concat(parseFloat(volume), result.slice(index));
  46. }
复制代码
测试样例
  1. // Test sample
  2. for(let m = 0; m < 10000; m++){
  3.     let total = (Math.random()*100 + 0.01).toFixed(2);
  4.     let number = Math.floor(Math.random()*20 +2);
  5.     while(total / number < 0.01){
  6.         number = Math.floor(Math.random()*20 +2);
  7.     }
  8.     let index = Math.floor(Math.random()*(number - 1));
  9.     let volume = (Math.random()*(total - 0.01*(number-1))+0.01).toFixed(2);
  10.     while(volume >= total || volume + 0.01*(number-1) > total){
  11.         // console.log(`xx:${volume}`);
  12.         volume = (Math.random()*(total - 0.01*(number-1))+0.01).toFixed(2);
  13.         volume = volume <= 0 ? 0.01 : volume;
  14.     }
  15.    
  16.    
  17.     let test = getPrize(total, number, index, volume);
  18.     // console.log(test);
  19.     let sum  = test.reduce((total,val)=>total+=parseFloat(val));
  20.     sum = sum.toFixed(2);
  21.     if(sum !== total) {
  22.         console.log(`volume:${volume}, total: ${total}, number: ${number}`);
  23.         console.log(`sum:${sum}`);
  24.         console.log(test);
  25.     }
  26.     test.map((val,index)=>{
  27.         if(val <= 0 && index !== test.length - 1){
  28.             console.log(`volume:${volume}, total: ${total}, number: ${number}`);
  29.             console.log(`sum:${sum}`);
  30.             console.log(test);
  31.         }
  32.     });
  33. }
复制代码
以上就是本文的全部内容,盼望对各人的学习有所资助,也盼望各人多多支持脚本之家。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作