Récemment, l'envoi d'enveloppes et de salutations rouges pendant le nouvel an chinois est devenue une nouvelle tendance. En tant que programmeur, il est beaucoup plus curieux à propos des algorithmes que des enveloppes rouges. Ici, nous introduisons une stratégie aléatoire d'allocation d'enveloppes rouges auxquelles il pensait. Donnez-moi des conseils.
Introduction de l'algorithme
1. Limite du montant de l'enveloppe rouge
Pour les enveloppes rouges WeChat, nous savons qu'aucune enveloppe rouge minimale aléatoire n'est 1 point et la quantité maximale n'est de 200 yuans. Ici, nous définissons également la gamme d'enveloppes rouges. Le code suivant est l'unité d'argent.
// Minimum Red Enveloppe Quota Private Static Final int Minmoney = 1; // Quota enveloppe rouge maximum private statique final int maxmoney = 200 * 100;
2. Déterminez si le montant de l'enveloppe rouge est légal
Notez que cette étape s'accompagne de l'ensemble de l'algorithme. Nous devons non seulement juger si le montant est légal avant d'allouer l'enveloppe rouge, mais aussi de juger si le montant restant est légal après que chaque personne a provisoirement fixé le montant aléatoire.
Private Boolean Isright (int Money, int count) {double avg = argent / count; if (avg <minmoney) {return false; } if (avg> maxmoney) {return false; } return true; } 3. Générer au hasard une enveloppe rouge
Ici, nous utilisons une méthode aléatoire pour générer une enveloppe rouge entre Minmoney et Maxmoney. Après avoir généré l'enveloppe rouge, nous devons déterminer si l'argent restant est une enveloppe rouge légale. S'il ne s'agit pas d'une enveloppe rouge légale, nous rénoverons le plan de distribution. Lors de la régénération du plan de distribution, nous devons déterminer si l'enveloppe rouge générée est trop grande ou trop petite. Si l'enveloppe rouge est trop grande, la prochaine fois, nous atteindrons au hasard une petite valeur à une enveloppe rouge de cette quantité d'enveloppe rouge. Si la quantité d'enveloppe rouge est trop petite, nous générerons une enveloppe rouge avec une enveloppe rouge à une grande valeur.
private int random (int money, int mins, int maxs, int count) {// Le nombre d'enveloppes rouges est 1, et le montant est renvoyé directement si (count == 1) {return money; } // Si le montant maximum et le montant minimum sont égaux, le montant est renvoyé directement si (min == maxs) {return minS; } int max = maxs> argent? Argent: Maxs; // Random Générer une enveloppe rouge int 1 = ((int) math.rint (math.random () * (max - min) + min))% max + 1; int Money1 = Money - un; // jugez si ce plan d'allocation est correct si (Isright (Money1, Count -1)) {renvoie un; } else {double avg = Money1 / (count - 1); if (avg <minmoney) {// Appelez récursivement, modifiez la quantité maximale d'enveloppe rouge renvoie aléatoire (argent, min, un, comptage); } else if (avg> maxmoney) {// Appelez récursivement, modifiez la quantité minimale d'enveloppe rouge return aléatoire (argent, un, maxs, count); }} renvoie un; } 4. Réalisez l'allocation des enveloppes rouges
Ici, afin d'éviter une certaine enveloppe rouge occupant une grande quantité de fonds, nous devons définir la quantité maximale de l'enveloppe rouge non-lamelle, et nous l'avons réglé sur n fois la quantité moyenne d'enveloppe rouge; Avec la méthode d'un, deux et trois, nous pouvons réaliser l'allocation des enveloppes rouges.
// La quantité maximale de chaque enveloppe rouge est un multiple des temps doubles finaux statiques privés moyens privés = 2,1; Public List <Integer> SplitRedPackets (int Money, int count) {if (! Isright (Money, Count)) {return null; } List <Integer> list = new ArrayList <Integer> (); // Le montant maximum de l'enveloppe rouge est en temps temps le montant moyen int max = (int) (argent * fois / count); max = max> maxmoney? Maxmoney: Max; pour (int i = 0; i <count; i ++) {int one = random (Money, Minmoney, max, count - i); list.add (un); argent - = un; } Retour List; }Évaluation du plan d'allocation d'enveloppe rouge
Ce qui précède introduit l'algorithme de base pour les enveloppes rouges. Vérifions l'algorithme à la fois. Supposons qu'il y ait une enveloppe rouge de 200 yuans et 100 exemplaires. Jetons un coup d'œil au plan d'allocation final.
Code complet
/ ** * @ Description: * / package com.lulei.weixin.util; import java.util.arraylist; Importer java.util.list; import com.lulei.util.jsonutil; classe publique redpacketutil {// quota enveloppe rouge minimale private statique final int Minmoney = 1; // Quota enveloppe rouge maximum private statique final int maxmoney = 200 * 100; // Le nombre maximum de chaque enveloppe rouge est un multiple des temps doubles finaux statiques privés privés moyens = 2,1; / ** * @param money * @param count * @return * @author: Lulei * @Description: Split Red Envelope * / public List <Integer> SplitRedPackets (int Money, int count) {if (! IsRight (Money, Count)) {return null; } List <Integer> list = new ArrayList <Integer> (); // Le montant maximum de l'enveloppe rouge est en temps temps le montant moyen int max = (int) (argent * fois / count); max = max> maxmoney? Maxmoney: Max; pour (int i = 0; i <count; i ++) {int one = random (Money, Minmoney, max, count - i); list.add (un); argent - = un; } Retour List; } / ** * @param money * @param mins * @param maxs * @param count * @return * @author: Lulei * @description: Random Red Envelope Limit * / private int random (int Money, int Mins, int maxs, int count) {// Le nombre d'enveloppes Red; } // Si le montant maximum et le montant minimum sont égaux, le montant sera renvoyé directement si (minns == maxs) {return minS; } int max = maxs> argent? Argent: Maxs; // Random Générer une enveloppe rouge int 1 = ((int) math.rint (math.random () * (max - min) + min))% max + 1; int Money1 = Money - un; // jugez si ce plan d'allocation est correct si (Isright (Money1, Count -1)) {renvoie un; } else {double avg = Money1 / (count - 1); if (avg <minmoney) {// Appelez récursivement, modifiez la quantité maximale d'enveloppe rouge renvoie aléatoire (argent, min, un, comptage); } else if (avg> maxmoney) {// Appel récursif, modifiez la quantité minimale d'enveloppe rouge rendement aléatoire (argent, un, maxs, count); }} renvoie un; } / ** * @param Money * @param Count * @return * @author: Lulei * @Description: Ce type d'enveloppe rouge est-il légal? * / private boolean isRight (int money, int count) {double avg = argent / count; if (avg <minmoney) {return false; } if (avg> maxmoney) {return false; } return true; } public static void main (String [] args) {// TODO Méthode générée automatique Stume redpacketutil util = new redPacketutil (); System.out.println (jsonutil.parsejson (util.splitRedPackets (20000, 100))); }}Pour un contenu plus excitant, veuillez cliquer sur "Android WeChat Development Tutorial Résumé" et "Java WeChat Development Tutorial Résumé" Bienvenue à tout le monde pour apprendre et lire.
Ce qui précède concerne cet article, j'espère qu'il sera utile pour tout le monde d'apprendre la programmation Java.