Vor kurzem ist es zu einem neuen Trend geworden, rote Umschläge und Grüße während des chinesischen Neujahrs zu schicken. Als Programmierer ist er viel neugieriger für Algorithmen als um rote Umschläge. Hier führen wir eine zufällige Strategie zur Allokation der roten Umschlag ein, an die er dachte. Bitte geben Sie mir einen Rat.
Algorithmus Einführung
1. RET -Hüllbetragsgrenze
Für WeChat Red -Umschläge wissen wir, dass kein zufälliger minimaler roter Umschlag 1 Punkt und die maximale Menge 200 Yuan beträgt. Hier setzen wir auch den Bereich der roten Umschläge. Der folgende Code ist die Geldeinheit.
// Minimum Red Envelope Quota Private statische endgültige int minmoney = 1; // Maximale rote Umschlagquote Private statische endgültige int maxmoney = 200 * 100;
2. Stellen Sie fest, ob die Höhe des roten Umschlags legal ist
Beachten Sie, dass dieser Schritt vom gesamten Algorithmus begleitet wird. Wir müssen nicht nur beurteilen, ob der Betrag legal ist, bevor wir den roten Umschlag zuweisen, sondern auch beurteilen, ob der verbleibende Betrag legal ist, nachdem jede Person den Zufallsbetrag vorläufig festgelegt hat.
Private boolean isRight (int Money, int count) {double avg = money / count; if (avg <minmoney) {return false; } if (avg> maxmoney) {return false; } Return true; } 3. Erzeugen Sie zufällig einen roten Umschlag
Hier verwenden wir eine zufällige Methode, um einen roten Umschlag zwischen Minmoney und MaxMoney zu generieren. Nachdem wir den roten Umschlag generiert haben, müssen wir feststellen, ob das verbleibende Geld ein legaler roter Umschlag ist. Wenn es sich nicht um einen legalen roten Umschlag handelt, generieren wir den Verteilungsplan erneut. Bei der Wiedererzeugung des Verteilungsplans müssen wir feststellen, ob die erzeugte rote Hülle zu groß oder zu klein ist. Wenn der rote Umschlag zu groß ist, erreichen wir das nächste Mal zufällig einen kleinen Wert für einen roten Umschlag dieser roten Umschlagbetrag. Wenn die rote Umschlagmenge zu klein ist, erzeugen wir einen roten Umschlag mit einer roten Umschlagbetrag auf einen großen Wert.
private int random (int Money, int mins, int maxs, int count) {// Die Anzahl der roten Umschläge beträgt 1 und der Betrag wird direkt zurückgegeben, wenn (count == 1) {Return Money; } // Wenn der maximale Betrag und der minimale Betrag gleich sind, wird der Betrag direkt zurückgegeben, wenn (mins == maxs) {return mins; } int max = maxs> Geld? Geld: Maxs; // zufällig generieren Sie eine rote Hülle int eins = ((int) math.rint (math.random () * (max - mins) + min) % max + 1; int Money1 = Geld - eins; // Beurteilen Sie, ob dieser Zuweisungsplan korrekt ist, wenn (isRight (Money1, count -1)) {return One; } else {double avg = mEY11 / (count - 1); if (avg <minmoney) {// rekursiv aufrufen, ändern Sie die maximale Menge der roten Umschlagrendite zufällig (Geld, mins, eine, zählen); } else if (avg> maxmoney) {// rekursiv aufrufen, ändern Sie den Mindestbetrag der roten Umschlagrendite zufällig (Geld, eins, maxs, count); }} zurückgeben; } V.
Um zu vermeiden, dass eine bestimmte rote Umschlag, die eine große Menge an Fonds einnimmt, müssen wir die maximale Menge der nicht belasteten roten Hülle festlegen, und wir setzen sie auf die durchschnittliche rote Umschlagbetrag. Mit der Methode von einem, zwei und drei können wir die Zuweisung von roten Umschlägen realisieren.
// Die maximale Menge jeder roten Hülle ist ein Vielfaches der durchschnittlichen privaten statischen doppelten Zeiten = 2,1; public list <GanzEger> SplitRedPackets (int Money, int count) {if (! isRight (Geld, Graf)) {return null; } List <Integer> list = new ArrayList <GanzEger> (); // Der maximale Betrag der roten Umschlag beträgt Male. max = max> maxmoney? MaxMoney: Max; für (int i = 0; i <count; i ++) {int eins = random (Geld, Minmoney, max, count - i); list.add (eins); Geld -= eins; } Rückgabeliste; }Bewertung des roten Umschlagszuordnungsplanes
Das obige führt den Basisalgorithmus für rote Umschläge ein. Überprüfen wir den Algorithmus gleichzeitig. Angenommen, es gibt einen roten Umschlag von 200 Yuan und 100 Exemplare. Schauen wir uns den endgültigen Zuweisungsplan an.
Vollständiger Code
/ ** *@Beschreibung: */ package com.lulei.weixin.util; Import Java.util.ArrayList; importieren java.util.list; import com.lulei.util.jsonutil; public class Redpacketutil {// Minimum Red Envelope Quota Private statische endgültige int minmoney = 1; // Maximale rote Umschlagquote Private statische endgültige int maxmoney = 200 * 100; // Die maximale Anzahl jeder roten Umschlag ist ein Vielfaches der durchschnittlichen privaten statischen doppelten Zeiten = 2,1; / ** * @param Money * @param count * @return * @Author: lulei * @Description: Split Red Envelope */ publiclist <Grapier> SplitRedPackets (int Money, int count) {if (! Isright (Geld, Count)) {return null; } List <Integer> list = new ArrayList <GanzEger> (); // Der maximale Betrag der roten Umschlag beträgt Male. max = max> maxmoney? MaxMoney: Max; für (int i = 0; i <count; i ++) {int eins = random (Geld, Minmoney, max, count - i); list.add (eins); Geld -= eins; } Rückgabeliste; } /** * @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) { //The number of red envelopes is 1, and the amount is directly returned if (count == 1) { return money; } // Wenn der maximale Betrag und der minimale Betrag gleich sind, wird der Betrag direkt zurückgegeben, wenn (mins == maxs) {return mins; } int max = maxs> Geld? Geld: Maxs; // zufällig generieren Sie eine rote Hülle int eins = ((int) math.rint (math.random () * (max - mins) + min) % max + 1; int Money1 = Geld - eins; // Beurteilen Sie, ob dieser Zuweisungsplan korrekt ist, wenn (isRight (Money1, count -1)) {return One; } else {double avg = mEY11 / (count - 1); if (avg <minmoney) {// rekursiv aufrufen, ändern Sie die maximale Menge der roten Umschlagrendite zufällig (Geld, mins, eine, zählen); } else if (avg> maxmoney) {// rekursiver Anruf, ändern Sie den Mindestbetrag der roten Umschlagrendite zufällig (Geld, eins, maxs, count); }} zurückgeben; } / ** * @Param Money * @param count * @return * @Author: lulei * @Description: Ist diese Art von rotem Umschlag legal? if (avg <minmoney) {return false; } if (avg> maxmoney) {return false; } Return true; } public static void main (String [] args) {// Todo automatisch generierte Methode Stub RedpacketUtil util = new RedPacketUtil (); System.out.println (jsonutil.parsejson (util.splitredPackets (20000, 100))); }}Weitere aufregende Inhalte finden Sie auf "Android Wechat Development Tutorial Summary" und "Java Wechat Development Tutorial Summary". Begrüßen Sie alle zum Erlernen und Lesen.
Das obige dreht sich alles um diesen Artikel. Ich hoffe, dass es für alle hilfreich sein wird, Java -Programme zu lernen.