Das chinesische Neujahr kommt bald. WeChat Red -Umschläge sind während des chinesischen Neujahrs sehr beliebt. Vor kurzem wollte ein Projekt auch rote Umschläge schnappen, also schrieb ich einen Algorithmus zur Erzeugung von Red Envelope.
Anforderungen für den Algorithmus zur Erzeugung von rotem Umschlag
Erstellen Sie alle roten Umschläge vor oder generieren Sie zufällig einen roten Umschlag, wenn eine Anfrage
Einfach ausgedrückt, es ist der Prozess, eine große Ganzzahl (direkt in Einheiten von "Teilen in" Einheiten wie 1 Yuan, dh 100) in N -Small Ganzzahlen zu zerlegen. Der Bereich der Smallgassen ist [min, max].
Die einfachste Idee besteht darin, zuerst das Endergebnis zu garantieren, jeder kleine rote Umschlag hat min. Anschließend erzeugt jede Anforderung zufällig eine Ganzzahl von 0 bis (max-min) und füge dann Min zum Geld des roten Umschlags hinzu.
Obwohl dieser Algorithmus einfach ist, hat er einen Nachteil: Die am Ende erzeugten roten Umschläge können alles min -Geld sein. Mit anderen Worten, der letzte rote Umschlag kann 0,01 Yuan sein.
Eine andere Möglichkeit besteht darin, alle roten Umschläge vorzubauen, damit es einfacher zu kontrollieren ist. Ich habe mich entschlossen, alle roten Umschläge vorzubereiten.
Idealer Algorithmus zur Erzeugung der roten Hülle
Das ideale Ergebnis der roten Hüllkurve ist, dass es in der Nähe des Durchschnittswerts mehr rote Umschläge gibt und relativ wenige große rote Umschläge und kleine rote Umschläge gibt.
Wie Sie sich vorstellen können, ist die Verteilung der Anzahl der generierten roten Pakete etwas wie eine Normalverteilung.
Wie kann man diese Anforderung von mehr Werten in der Nähe der durchschnittlichen Linie erreichen?
Es soll einen Algorithmus finden, der die Wahrscheinlichkeit um den Durchschnitt erhöhen kann. Verwenden Sie dann eine "Expansion" und "Kontraktion" -Methode, um diesen Effekt zu erzielen.
Wenn Sie das erste Quadrat haben, erzeugen Sie zufällige Zahlen im quadratischen Bereich und dann das Quadrat, dann ist die Wahrscheinlichkeit nicht mehr durchschnittlich.
Spezifischer Algorithmus:
public class hongbaoalgorithmus {static random randal = new Random (); static {randomSetSeed (SystemCurrentTimemillis ()); } public static void main (String [] args) {long max = 200; lange min = 1; long [] result = hongbaoalgorithmererate (100_0000, 10_000, max, min); langes Gesamtbetrag = 0; für (int i = 0; i <resultLength; i ++) {// systemoutprintln ("result [" + i + "]:" + result [i]); // Systememoutprintln (Ergebnis [i]); Gesamt += Ergebnis [i]; } // Überprüfen Sie, ob die Gesamtmenge der generierten roten Pakete korrekt ist, systememoutprintln ("Gesamt:" + Gesamt); // Berechnen Sie die Anzahl der roten Pakete für jedes Geld und prüfen Sie, ob sie in der Nähe der Normalverteilung Int Count [] = New int [(int) max + 1] liegt. für (int i = 0; i <resultLength; i ++) {count [(int) Ergebnis [i]]+= 1; } für (int i = 0; i <countLength; i ++) {Systememoutprintln ("" + i + "" + count [i]); }} /*** erzeugt zufällige Zahlen zwischen min und max, aber die Wahrscheinlichkeit ist nicht durchschnittlich, und die Wahrscheinlichkeit von min bis maximal erhöht sich allmählich. * Erstes Quadrat, dann eine zufällige Zahl innerhalb des Quadratwerts erzeugen und dann einen Effekt von "Expansion" und "Schrumpfung" erzeugt. * * @param min * @param max * @return */ static long xrandom (long min, long max) {return sqrt (nextlong (sqr (max - min)); } /** * * @param total * Total red envelope amount* @param count * Number of red envelopes* @param max * Maximum amount of each small red envelope* @param min * Minimum amount of each small red envelope* @return Array of values of each small red envelope generated*/ public static long[] generate(long total, int count, long max, long min) { long[] result = new long[count]; langer Durchschnitt = Gesamt / Anzahl; lang a = durchschnittlich - min; lang B = max - min; // // Die Wahrscheinlichkeit einer solchen Zufallszahl hat sich tatsächlich geändert, und die Möglichkeit, eine große Anzahl zu generieren, ist kleiner als die Wahrscheinlichkeit, eine Dezimalzahl zu generieren. // Dies erreicht, dass die meisten roten Umschläge den Wert rund um den Durchschnitt haben. Es gibt weniger große rote Umschläge und kleine rote Umschläge. long range1 = sqr (durchschnittlich - min); Long Range2 = SQR (max - Durchschnitt); für (int i = 0; i <resultLength; i ++) {// weil die Anzahl der kleinen roten Umschläge normalerweise höher ist als die Anzahl der großen roten Umschläge, da die Wahrscheinlichkeit hier geändert werden muss. // Wenn die Zufallszahl> Durchschnittswert ein kleiner roter Umschlag generiert wird // Wenn die Zufallszahl <Durchschnittswert <Durchschnittswert, eine große rote Umschlag generiert wird, wenn (Nextlong (min, max)> Durchschnitt) {// Geld in der durchschnittlichen Linie reduzieren // Long Temp = min + SQRT (nächstesLong (Bereich)); lange Temperatur = min + xrandom (min, Durchschnitt); Ergebnis [i] = temp; Gesamt -= Temp; } else {// Geld in der durchschnittlichen Zeile hinzufügen // long temp = max - sqrt (Nextlong (Bereich2)); Long temp = max - xrandom (durchschnittlich, max); Ergebnis [i] = temp; Gesamt -= Temp; }} // Wenn noch Geld übrig ist, fügen Sie es dem kleinen roten Umschlag hinzu. Wenn es nicht hinzugefügt werden kann, versuchen Sie es mit dem nächsten. while (Total> 0) {für (int i = 0; i <resultLength; i ++) {if (total> 0 && result [i] <max) {result [i] ++; gesamt--; }}} // Wenn das Geld negativ ist, müssen Sie von der generierten kleinen roten Hülle zurückziehen, während (Gesamt <0) {für (int i = 0; i <resultLength; i ++) {if (insgesamt <0 && Ergebnis [i]> min) {result [i]-; Gesamt ++; }}} Rückgabeergebnis; } static Long Sqrt (lang n) {// verbessert die Tisch -Lookup? return (lang) mathsqrt (n); } static Long SQR (lang n) {// ist die Tabelle schnell oder wird sie schnell berechnet? return n * n; } static Long Nextlong (lang n) {return randomNextint ((int) n); } static Long Nextlong (langes min, long max) {return randomNextint (int) (max - min + 1)) + min; }}Nach dem Zählen der generierten Ergebnisse stehen sie ganz den Anforderungen.
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.