suchen
HeimBackend-EntwicklungPHP-TutorialPHP-Algorithmus zum Generieren zufälliger roter Umschläge

1. Hintergrundeinführung

Vor einiger Zeit musste das Unternehmen rote Umschläge generieren, die in feste rote Umschläge und zufällige rote Umschläge unterteilt sind Rote Umschläge und zufällige rote Umschläge erfordern einen Mindestwert und einen Höchstwert. Es muss mindestens einen Höchstwert geben. Es kann keinen Mindestwert geben, aber jeder rote Umschlag darf nicht kleiner als der Mindestwert sein.
Ich hatte das noch nie gemacht und war etwas verwirrt, also ging ich zu Baidu und stellte fest, dass alle Red-Envelope-Algorithmen, die ich finden konnte, verschiedene Fehler hatten. Sie würden entweder negative Werte berechnen oder den Maximalwert überschreiten Ich habe beschlossen, selbst ein Set zu machen.

PHP-Algorithmus zum Generieren zufälliger roter Umschläge


2. Grundideen

In Bezug auf die Zufallszahlengenerierung habe ich von gelernt Dies Die Gedanken eines Bloggers@elender Onkel:

Originaltext: Wenn Sie beispielsweise 1 roten Umschlag an N Personen verteilen möchten, entspricht dies tatsächlich dem Erhalt von N Prozentangaben Die Bedingung ist, dass die Summe dieser N Prozentsätze = 100/100 ist. Der Durchschnitt dieser N-Prozentsätze beträgt 1/N. Und diese N-Prozentdaten entsprechen einer Normalverteilung (die meisten Werte liegen näher am Mittelwert).
Interpretation: Wenn ich beispielsweise 1.000 Yuan habe und 50 rote Umschläge verteile, wähle ich zuerst zufällig 50 Zahlen aus und berechne dann den Mittelwert $avg dieser 50 Zahlen mit $avg /(1/N ), erhalten Sie einen Basis-$mixrand und dividieren dann die 50 zufällig generierten Zahlen durch $mixrand, um den Prozentsatz jeder Zahl im Verhältnis zum Basis-$randVal zu erhalten, und multiplizieren Sie dann $randVal mit 1.000 Yuan, um jede Zahl zu erhalten Der spezifische Betrag des roten Umschlags.

Immer noch nicht sicher, was los ist? Egal, lasst uns gemeinsam programmieren!

PHP-Algorithmus zum Generieren zufälliger roter Umschläge


3. Reden ist günstig, zeigen Sie mir Ihren Code!

Rote Umschlaggenerierung Kernalgorithmus:
<?php /*
 * Author:xx_lufei
 * Time:2016年9月14日09:55:36
 * Note:红包生成随机算法
 */

class Reward
{
    public $rewardMoney;        #红包金额、单位元
    public $rewardNum;          #红包数量

    #执行红包生成算法
    public function splitReward($rewardMoney, $rewardNum, $max, $min)
    {
        #传入红包金额和数量,因为小数在计算过程中会出现很大误差,所以我们直接把金额放大100倍,后面的计算全部用整数进行
        $min = $min * 100;
        $max = $max * 100;
        #预留出一部分钱作为误差补偿,保证每个红包至少有一个最小值
        $this->rewardMoney = $rewardMoney * 100 - $rewardNum * $min;
        $this->rewardNum = $rewardNum;
        #计算出发出红包的平均概率值、精确到小数4位。
        $avgRand = 1 / $this->rewardNum;
        $randArr = array();
        #定义生成的数据总合sum
        $sum = 0;
        $t_count = 0;
        while ($t_count  $randVal) {
            #单个红包所占比例randVal
            $randVal = round($randVal / $mixrand, 4);
            #算出单个红包金额
            $single = floor($this->rewardMoney * $randVal);
            #小于最小值直接给最小值
            if ($single  $max) {
                $single = $max;
            }
            #将红包放入结果数组
            $rewardArr[] = $single;
        }

        #对比红包总数的差异、将差值放在第一个红包上
        $rewardAll = array_sum($rewardArr);
        $rewardArr[0] = $rewardMoney * 100 - ($rewardAll - $rewardArr[0]);#此处应使用真正的总金额rewardMoney,$rewardArr[0]可能小于0

        #第一个红包小于0时,做修正
        if ($rewardArr[0] add($rewardArr, $min);
        }

        rsort($rewardArr);
        #随机生成的最大值大于指定最大值
        if ($rewardArr[0] > $max) {
            #差额
            $diff = 0;
            foreach ($rewardArr as $k => &$v) {
                if ($v > $max) {
                    $diff += $v - $max;
                    $v = $max;
                } else {
                    break;
                }
            }
            $transfer = round($diff / ($this->rewardNum - $k + 1));
            $this->diff($diff, $rewardArr, $max, $min, $transfer, $k);
        }
        return $rewardArr;
    }

    #处理所有超过最大值的红包
    public function diff($diff, &$rewardArr, $max, $min, $transfer, $k)
    {
        #将多余的钱均摊给小于最大值的红包
        for ($i = $k; $i rewardNum; $i++) {
            #造随机值
            if ($transfer > $min * 20) {
                $aa = rand($min, $min * 20);
                if ($i % 2) {
                    $transfer += $aa;
                } else {
                    $transfer -= $aa;
                }
            }
            if ($rewardArr[$i] + $transfer > $max) continue;
            if ($diff - $transfer  0) {
            $i++;
            $this->diff($diff, $rewardArr, $max, $min, $transfer, $k);
        }
    }

    #第一个红包小于0,从大红包上往下减
    public function add(&$rewardArr, $min)
    {
        foreach ($rewardArr as &$re) {
            $dev = floor($re / $min);
            if ($dev > 2) {
                $transfer = $min * floor($dev / 2);
                $re -= $transfer;
                $rewardArr[$this->rewardNum - 1] += $transfer;
            } elseif ($dev == 2) {
                $re -= $min;
                $rewardArr[$this->rewardNum - 1] += $min;
            } else {
                break;
            }
        }
        if ($rewardArr[$this->rewardNum - 1] > $min || $rewardArr[$this->rewardNum - 1] == $min) {
            return;
        } else {
            $this->add($rewardArr, $min);
        }
    }
}
Zu berücksichtigende Details:

Der folgende Code wird verwendet, um bestimmte Geschäftslogiken zu steuern und feste maximale und minimale Beträge für rote Umschläge entsprechend den spezifischen Anforderungen beiseite zu legen ;
Beim Aufruf von splitReward($total, $num,$max - 0.01, $min); im Code wurde der von mir übergebene Maximalwert um 0,01 reduziert, um sicherzustellen, dass der darin generierte rote Umschlag der größte Wert ist Überschreiten Sie niemals den von uns festgelegten Maximalwert.

<?php  
class CreateReward{
    /*
     * 生成红包
     * author    xx     2016年9月23日13:53:38
     * @param   int          $total               红包总金额
     * @param   int          $num                 红包总数量
     * @param   int          $max                 红包最大值
     * 
     */
    public function random_red($total, $num, $max, $min)
    {
        #总共要发的红包金额,留出一个最大值;
        $total = $total - $max;
        $reward = new Reward();
        $result_merge = $reward->splitReward($total, $num, $max - 0.01, $min);
        sort($result_merge);
        $result_merge[1] = $result_merge[1] + $result_merge[0];
        $result_merge[0] = $max * 100;
        foreach ($result_merge as &$v) {
            $v = floor($v) / 100;
        }
        return $result_merge;
    }
}

4. Ziehen Sie es für einen Spaziergang heraus

Grundcode:

Verschiedene Anfangswerte einstellen

<?php /**
 * Created by PhpStorm.
 * User: lufei
 * Date: 2017/1/4
 * Time: 22:49
 */
header(&#39;content-type:text/html;charset=utf-8&#39;);
ini_set(&#39;memory_limit&#39;, &#39;128M&#39;);

require_once(&#39;CreateReward.php&#39;);
require_once(&#39;Reward.php&#39;);

$total = 50000;
$num = 300000;
$max = 50;
$min = 0.01;

$create_reward = new CreateReward();
Leistungstest:

Aufgrund der Beschränkung von „memory_limit“ habe ich nur den Durchschnittswert von 5 Mal gemessen und die Ergebnisse lagen alle bei etwa 1,6 Sekunden.

for($i=0; $irandom_red($total, $num, $max, $min);
    $time_end = microtime_float();
    $time[] = $time_end - $time_start;
}
echo array_sum($time)/5;
function microtime_float()
{
    list($usec, $sec) = explode(" ", microtime());
    return ((float)$usec + (float)$sec);
}

Laufergebnisse:

PHP-Algorithmus zum Generieren zufälliger roter Umschläge


Datenprüfung:

Erkennen Sie, ob es negative Werte gibt, ob es einen Maximalwert gibt, wie viele Maximalwerte es gibt und ob es einen Wert gibt, der kleiner als der Minimalwert ist.

$reward_arr = $create_reward->random_red($total, $num, $max, $min);
sort($reward_arr);//正序,最小的在前面
$sum = 0;
$min_count = 0;
$max_count = 0;
foreach($reward_arr as $i => $val) {
    if ($i第".($i+1)."个红包,金额为:".$val."<br>";  
    } 
    if ($val == $max) {
          $max_count++;
    }
    if ($val 已生成红包总金额为:'.($sum/100).';总个数为:'.count($reward_arr).'<hr>';
//检测有没有小于0的值
echo "<br>最大值:".($val/100).',共有'.$max_count.'个最大值,共有'.$min_count.'个值比最小值小';

Ergebnisse ausführen; :

PHP-Algorithmus zum Generieren zufälliger roter Umschläge


Normalverteilungsdiagramm:

Beachten Sie dies beim Zeichnen des Bildes Geben Sie nicht zu viele rote Umschläge ein, sonst kann die Seite nicht gerendert werden und stürzt ab
Laufergebnis:

PHP-Algorithmus zum Generieren zufälliger roter Umschläge


$reward_arr = $create_reward->random_red($total, $num, $max, $min);
$show = array();
rsort($reward_arr);
//为了更直观的显示正态分布效果,需要将数组重新排序
foreach($reward_arr as $k=>$value)
{
    $t=$k%2;
    if(!$t) $show[]=$value;;
    else array_unshift($show,$value);
}
echo "设定最大值为:".$max.',最小值为:'.$min.'<hr>';
echo "
"; foreach($show as $val) {     #线条长度计算     $width=intval($num*$val*300/$total);     echo ""; } echo "
红包金额 图示
 {$val} 
";

PS: Ein Freund hat mich gefragt, ob die generierten Daten vorliegen Es wurde mathematisch verifiziert, dass es der Standardnormalverteilung entspricht. Da ich nicht gut in Mathematik bin, habe ich es mir nur angeschaut und gedacht, dass es so aussieht, also habe ich es so genommen.
Da ich auf dieses Problem gestoßen bin, muss ich es lösen, also habe ich die in PHP

integrierte Funktion PHP-Algorithmus zum Generieren zufälliger roter Umschläge verwendet, um es zu berechnen. Das berechnete Ergebnis liegt relativ nahe an der Normalverteilung, wenn die Datenmenge klein ist Aber wenn die Datenmenge zunimmt, kann ich das nicht ganz verstehen. Wenn Sie interessiert sind, können Sie den Grund herausfinden.
Vier Funktionen von PHP: stats_standard_deviation (Standardabweichung), stats_variance (Varianz), stats_kurtosis (Kurtosis), stats_skew (Skewness)

Um die oben genannten Funktionen verwenden zu können, müssen Sie

die
stats-Erweiterung installieren @Adresse herunterladen

5. Am Ende


Zu diesem Zeitpunkt ist der rote Umschlag geschrieben. Ich weiß nicht, ob ich eine Gehaltserhöhung von 50 Yuan bekommen kann, aber es sollte sein in der Lage, den dringenden Bedarf zu lösen.


Oh ja, ich habe auch dieses Codepaket heruntergeladen

PHP-Algorithmus zum Generieren zufälliger roter Umschläge



Das obige ist der detaillierte Inhalt vonPHP-Algorithmus zum Generieren zufälliger roter Umschläge. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Wie funktioniert der Php -Typ -Hinweis, einschließlich Skalartypen, Rückgabetypen, Gewerkschaftstypen und nullbaren Typen?Wie funktioniert der Php -Typ -Hinweis, einschließlich Skalartypen, Rückgabetypen, Gewerkschaftstypen und nullbaren Typen?Apr 17, 2025 am 12:25 AM

PHP -Typ -Eingabeaufforderungen zur Verbesserung der Codequalität und der Lesbarkeit. 1) Tipps zum Skalartyp: Da Php7.0 in den Funktionsparametern wie int, float usw. angegeben werden dürfen. 3) Eingabeaufforderung für Gewerkschaftstyp: Da Php8.0 in Funktionsparametern oder Rückgabetypen angegeben werden dürfen. 4) Nullierstyp Eingabeaufforderung: Ermöglicht die Einbeziehung von Nullwerten und Handlungsfunktionen, die Nullwerte zurückgeben können.

Wie handelt es sich bei PHP -Objektklonen (Klonschlüsselwort) und der __clone Magic -Methode?Wie handelt es sich bei PHP -Objektklonen (Klonschlüsselwort) und der __clone Magic -Methode?Apr 17, 2025 am 12:24 AM

Verwenden Sie in PHP das Klonschlüsselwort, um eine Kopie des Objekts zu erstellen und das Klonierungsverhalten über die \ _ \ _ Clone Magic -Methode anzupassen. 1. Verwenden Sie das Klonschlüsselwort, um eine flache Kopie zu erstellen und die Eigenschaften des Objekts, nicht die Eigenschaften des Objekts zu klonen. 2. Die \ _ \ _ Klonmethode kann verschachtelte Objekte tief kopieren, um flache Kopierprobleme zu vermeiden. 3. achten Sie darauf, dass kreisförmige Referenzen und Leistungsprobleme beim Klonen vermieden werden, und optimieren Sie die Klonierungsvorgänge, um die Effizienz zu verbessern.

PHP vs. Python: Anwendungsfälle und AnwendungenPHP vs. Python: Anwendungsfälle und AnwendungenApr 17, 2025 am 12:23 AM

PHP eignet sich für Webentwicklungs- und Content -Management -Systeme, und Python eignet sich für Datenwissenschafts-, maschinelles Lernen- und Automatisierungsskripte. 1.PHP hat eine gute Leistung beim Erstellen von schnellen und skalierbaren Websites und Anwendungen und wird üblicherweise in CMS wie WordPress verwendet. 2. Python hat sich in den Bereichen Datenwissenschaft und maschinelles Lernen mit reichen Bibliotheken wie Numpy und TensorFlow übertrifft.

Beschreiben Sie verschiedene HTTP-Caching-Header (z. B. Cache-Control, ETAG, Last-modifiziert).Beschreiben Sie verschiedene HTTP-Caching-Header (z. B. Cache-Control, ETAG, Last-modifiziert).Apr 17, 2025 am 12:22 AM

Zu den wichtigsten Spielern in HTTP-Cache-Headern gehören Cache-Control, ETAG und Last-modifiziert. 1.Cache-Control wird verwendet, um die Richtlinien zu kontrollieren. Beispiel: Cache-Control: max-ay = 3600, öffentlich. 2. ETAG überprüft Ressourcenänderungen durch eindeutige Identifikatoren, Beispiel: ETAG: "686897696A7C876B7E". 3. Last-modifiziert gibt die letzte Änderungszeit der Ressource an, Beispiel: Last-Modified: Mi, 21okt201507: 28: 00GMT.

Erklären Sie sicheres Kennwort -Hashing in PHP (z. B. password_hash, password_verify). Warum nicht MD5 oder SHA1 verwenden?Erklären Sie sicheres Kennwort -Hashing in PHP (z. B. password_hash, password_verify). Warum nicht MD5 oder SHA1 verwenden?Apr 17, 2025 am 12:06 AM

In PHP sollten die Funktionen für Passwort_Hash und passwart_verify verwendet werden, um sicheres Passwort -Hashing zu implementieren, und MD5 oder SHA1 sollte nicht verwendet werden. 1) Passwort_hash generiert einen Hash, der Salzwerte enthält, um die Sicherheit zu verbessern. 2) Passwort_Verify prüfen Sie das Passwort und sicherstellen Sie die Sicherheit, indem Sie die Hash -Werte vergleichen. 3) MD5 und SHA1 sind anfällig und fehlen Salzwerte und sind nicht für die Sicherheit der modernen Passwort geeignet.

PHP: Eine Einführung in die serverseitige SkriptsprachePHP: Eine Einführung in die serverseitige SkriptspracheApr 16, 2025 am 12:18 AM

PHP ist eine serverseitige Skriptsprache, die für dynamische Webentwicklung und serverseitige Anwendungen verwendet wird. 1.PHP ist eine interpretierte Sprache, die keine Zusammenstellung erfordert und für die schnelle Entwicklung geeignet ist. 2. PHP -Code ist in HTML eingebettet, wodurch es einfach ist, Webseiten zu entwickeln. 3. PHP verarbeitet die serverseitige Logik, generiert die HTML-Ausgabe und unterstützt Benutzerinteraktion und Datenverarbeitung. 4. PHP kann mit der Datenbank interagieren, die Einreichung von Prozessformularen und serverseitige Aufgaben ausführen.

PHP und das Web: Erforschen der langfristigen AuswirkungenPHP und das Web: Erforschen der langfristigen AuswirkungenApr 16, 2025 am 12:17 AM

PHP hat das Netzwerk in den letzten Jahrzehnten geprägt und wird weiterhin eine wichtige Rolle bei der Webentwicklung spielen. 1) PHP stammt aus dem Jahr 1994 und ist aufgrund seiner Benutzerfreundlichkeit und der nahtlosen Integration in MySQL die erste Wahl für Entwickler. 2) Zu den Kernfunktionen gehört das Generieren dynamischer Inhalte und die Integration in die Datenbank, sodass die Website in Echtzeit aktualisiert und auf personalisierte Weise angezeigt wird. 3) Die breite Anwendung und das Ökosystem von PHP hat seine langfristigen Auswirkungen angetrieben, steht jedoch auch mit Versionsaktualisierungen und Sicherheitsherausforderungen gegenüber. 4) Leistungsverbesserungen in den letzten Jahren, wie die Veröffentlichung von PHP7, ermöglichen es ihm, mit modernen Sprachen zu konkurrieren. 5) In Zukunft muss PHP sich mit neuen Herausforderungen wie Containerisierung und Microservices befassen, aber seine Flexibilität und die aktive Community machen es anpassungsfähig.

Warum PHP verwenden? Vorteile und Vorteile erläutertWarum PHP verwenden? Vorteile und Vorteile erläutertApr 16, 2025 am 12:16 AM

Zu den Kernvorteilen von PHP gehören einfacher Lernen, starke Unterstützung für Webentwicklung, reiche Bibliotheken und Rahmenbedingungen, hohe Leistung und Skalierbarkeit, plattformübergreifende Kompatibilität und Kosteneffizienz. 1) leicht zu erlernen und zu bedienen, geeignet für Anfänger; 2) gute Integration in Webserver und unterstützt mehrere Datenbanken. 3) leistungsstarke Frameworks wie Laravel; 4) hohe Leistung kann durch Optimierung erzielt werden; 5) mehrere Betriebssysteme unterstützen; 6) Open Source, um die Entwicklungskosten zu senken.

See all articles

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
1 Monate vorBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
1 Monate vorBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
1 Monate vorBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Chat -Befehle und wie man sie benutzt
1 Monate vorBy尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

WebStorm-Mac-Version

WebStorm-Mac-Version

Nützliche JavaScript-Entwicklungstools

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

EditPlus chinesische Crack-Version

EditPlus chinesische Crack-Version

Geringe Größe, Syntaxhervorhebung, unterstützt keine Code-Eingabeaufforderungsfunktion

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

VSCode Windows 64-Bit-Download

VSCode Windows 64-Bit-Download

Ein kostenloser und leistungsstarker IDE-Editor von Microsoft