This article shares the specific code of js to implement the specified red envelope order and amount for your reference. The specific content is as follows Preface
Effect displayEmpty package problemRed Envelope Algorithm/* param: float, int, int, float param1: total amount of red envelopes param2: number of red envelopes param3: specify special red envelopes param4: specify special red envelope amount*/ let getPrize = function(total, number, index, volume){ let allowance = total - volume; let arr = []; let i = 0; while(i < number - 2){ //Specify [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}`); // If the distribution is less than 0, exploit the strong and divide it equally 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; } } } // The last one is put in arr.push(parseFloat(allowance.toFixed(2))); let result = arr; return result.slice(0, index).concat(parseFloat(volume), result.slice(index)); } Test Examples // 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); } }); } The above is the full content of this article. I hope it will be helpful for everyone’s study. I also hope that everyone will support 123WORDPRESS.COM. You may also be interested in:
|
<<: A brief discussion on the efficiency of MySQL subquery union and in
>>: Example of using supervisor to manage nginx+tomcat containers
1. Statistics of PV and IP Count the PV (Page Vie...
Whitelist rule syntax: BasicRule wl:ID [negative]...
Recently, the company happened to be doing live b...
Table of contents Preface: Kind tips: variable 1....
Being a web designer is not easy. Not only do you...
In some scenarios, we need to modify our varchar ...
Table of contents iview-admin2.0 built-in permiss...
Based on the Vue image magnifier component packag...
Table of contents Inheritance and prototype chain...
Last night, I was looking at an interview question...
Mysql stored procedure 1. Create stored procedure...
This article describes MySQL multi-table query wi...
What is a sticky footer layout? Our common web pa...
Recently, there have been many database-related o...
The effect we need to achieve: What is needed The...