zoukankan      html  css  js  c++  java
  • PHP微信红包的算法实现探讨

    header("Content-Type: text/html;charset=utf-8");//输出不乱码,你懂的  
    $total=10;//红包总额  
    $num=8;// 分成8个红包,支持8人随机领取  
    $min=0.01;//每个人最少能收到0.01元  
      
    for ($i=1;$i<$num;$i++)  
    {  
        $safe_total=($total-($num-$i)*$min)/($num-$i);//随机安全上限  
        $money=mt_rand($min*100,$safe_total*100)/100;  
        $total=$total-$money;  
        echo '第'.$i.'个红包:'.$money.' 元,余额:'.$total.' 元 <br/>';  
    }  
    echo '第'.$num.'个红包:'.$total.' 元,余额:0 元';  
    输出结果见下图
    第1个红包:0.06 元,余额:9.94 元 
    第2个红包:1.55 元,余额:8.39 元 
    第3个红包:0.25 元,余额:8.14 元 
    第4个红包:0.98 元,余额:7.16 元 
    第5个红包:1.88 元,余额:5.28 元 
    第6个红包:1.92 元,余额:3.36 元 
    第7个红包:2.98 元,余额:0.38 元 
    第8个红包:0.38 元,余额:0 元
    

      

    分析规律

    设定总金额为10元,有N个人随机领取:
    N=1 
    则红包金额=X元; 
    
    N=2 
    为保证第二个红包可以正常发出,第一个红包金额=0.01至9.99之间的某个随机数 
    第二个红包=10-第一个红包金额; 
    
    N=3 
    红包1=0.01至0.98之间的某个随机数 
    红包2=0.01至(10-红包1-0.01)的某个随机数 
    红包3=10-红包1-红包2 
    .....
  • 相关阅读:
    Codeforces 691A Fashion in Berland
    HDU 5741 Helter Skelter
    HDU 5735 Born Slippy
    HDU 5739 Fantasia
    HDU 5738 Eureka
    HDU 5734 Acperience
    HDU 5742 It's All In The Mind
    POJ Euro Efficiency 1252
    AtCoder Beginner Contest 067 C
    AtCoder Beginner Contest 067 D
  • 原文地址:https://www.cnblogs.com/phpfensi/p/4643042.html
Copyright © 2011-2022 走看看