PHP 紅包功能代碼


前段時間被問這個問題,最近有空就寫寫啦,還是挺有趣的

首先做下搶紅包方法分類:

對於發紅包的人來說,一共有大致3類(其他的我暫時沒想到,有想到可以聯系我呀~)

一、拼手氣紅包個數不定(完全看運氣)

二、拼手氣紅包規定個數(個數一定,至少一分)

三、平均分紅包(個數一定,大家平分)還是這個好寫是吧!嘿嘿

上代碼:

<?php
var_dump(rob_red_bages(5 , 10));

var_dump(distribute_red_bages(5));

/*
方法主要功能:拼手氣紅包(個數不定)
一個參數
    參數一: 紅包總金額(按分計算)
*/
function distribute_red_bages($sum){
    $sum = $sum*100;
    $i=0;
    while($sum>0){
        $temp = rand(1 , $sum);//紅包值
        $sum -= $temp;
        $arr[$i++] = $temp/100;
    }
    //check($arr);
    return $arr;
}

/*
方法主要功能:均分紅包
兩個參數:
    參數一: 紅包總金額
    參數二: 均分個數
*/
function average_red_bages($sum , $num){
    $res = $sum/$num;
    for($i=0 ; $i<$num ; $i++){
        $arr[$i] = $res;
    }
    //check($arr);
    return $arr;
}

/*
方法主要功能:規定個數的手氣紅包
兩個參數: 
    參數一:紅包總金額
    參數二:紅包個數
    
    計算流程,隨機生成num個數
    求和得到m
    用sum/m 得到每個數需要k
    用隨機數*k
*/
function rob_red_bages($sum , $num){
    $sum = $sum*100;
    for($i=0 ; $i<$num ; $i++){
        $temp = rand(1 , $sum);
        $arr[$i] = $temp;
        $sumall += $temp;
    }
    $k = $sum/$sumall;
    for($i=0 ; $i<sizeof($arr); $i++){
        $arr2[$i] = $arr[$i]*$k/100;        
    }
    return $arr2;
}

/*紅包總額檢測*/
function check($arr){
    foreach($arr as $a){
        $sum += $a;
        echo $a."+";
    }
    
    echo " 0 =".$sum."\n";
}


?>

下面分析下拼手氣紅包吧(平分的就不說了,大家都會):

拼手氣紅包個數不定思路:(總金額:sum)

 ---->隨機第一個小於sum的數: n 

 ---->總金額減去該數: temp = sum-n 

 ---->隨機一個小於temp的數

 ---->遞歸上述方法直到總金額為0

 ---->返回存儲隨機結果的數組

這個方法比較常規,用來實現規定個數的紅包也是可以實現的!不過~

拼手氣紅包規定個數思路(總金額 sum,紅包個數 num )

 ---->隨機num個小於sum的數,生成數組

 ---->對這些數求和得到allsum

 ---->用sum除以allsum得到所有生成數的公倍數

 ---->數組每個元素與公倍數相乘得到每個紅包的的數值

這個方法有缺點(最終的結果可能會略大於sum,或者略小於sum 因為除法可能出現無理數)

大概就是這些啦!歡迎交流指正!~~~

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM