js implements the algorithm for specifying the order and amount of red envelopes

js implements the algorithm for specifying the order and amount of red envelopes

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

  • Written at the request of a friend
  • The minimum amount for a single package is 0.01
  • If all other values ​​except the specified amount are 0.01 , the probability of the last package being 0 is
  • This algorithm has passed 1,000,000 tests with an error rate of 3 per million

Effect display

Empty package problem

Red 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:
  • Using JS to implement binary tree traversal algorithm example code
  • How to use JavaScript to implement sorting algorithms
  • JavaScript programming through Matlab centroid algorithm positioning learning
  • Binary Search Tree Algorithm Tutorial for JavaScript Beginners
  • Summary of seven sorting algorithms implemented in JavaScript (recommended!)
  • A brief discussion on an efficient algorithm for constructing tree structures in JavaScript
  • How to Learn Algorithmic Complexity with JavaScript
  • How to use javascript to do simple algorithms

<<:  A brief discussion on the efficiency of MySQL subquery union and in

>>:  Example of using supervisor to manage nginx+tomcat containers

Recommend

Detailed explanation of nginx-naxsi whitelist rules

Whitelist rule syntax: BasicRule wl:ID [negative]...

Detailed explanation of Vue's live broadcast function

Recently, the company happened to be doing live b...

This article will help you understand JavaScript variables and data types

Table of contents Preface: Kind tips: variable 1....

50 Super Handy Tools for Web Designers

Being a web designer is not easy. Not only do you...

When modifying a record in MySQL, the update operation field = field + string

In some scenarios, we need to modify our varchar ...

Implementation of iview permission management

Table of contents iview-admin2.0 built-in permiss...

An article to help you understand Js inheritance and prototype chain

Table of contents Inheritance and prototype chain...

How complicated is the priority of CSS styles?

Last night, I was looking at an interview question...

MYSQL stored procedures, that is, a summary of common logical knowledge points

Mysql stored procedure 1. Create stored procedure...

Implementation of CSS sticky footer classic layout

What is a sticky footer layout? Our common web pa...

Super detailed MySQL usage specification sharing

Recently, there have been many database-related o...

How to use CSS to write different styles according to sub-elements

The effect we need to achieve: What is needed The...