,,,,,,,,前段时间有个项目需要用到红包算法,本以为简单,细想之下有点复杂。于是就百度了一下,没想到查出了不少,有些写的很复杂。由于时间有点紧,我就找了一个简单点的,然后参考着写一个。参考的地址是:https://blog.csdn.net/gorgle/article/details/52954413;
,,,,,,这个地址中的红包是用java写的。根据其原理,我用PHP写了一遍,并且改进了点。他的算法中没有加每个红包最大最小值限制。我用PHP写的时候加上去了。代码如下:
& lt; PHP ?/* $ total_money:红包总金额 $ total_people:总人数/总分数 $ min_money:每份红包的最小金额 $ max_money:每份红包的最大金额 */function redpack ($ total_money total_people美元min_money美元,美元max_money) { ,,数组$ ret=(); ,,数组$ new_ret=(); ,, ,,total_real_money=total_money - total_people美元*美元min_money; ,,随著美元[0]=0; ,,(i=1; i<美元;total_people美元,美元我+ +){ ,,,,,, ,,,,随著美元($ i)=get_rand (ret张[美元],total_real_money美元,(max_money - min_money美元)); ,,,, ,,,,, ,,} ,(ret); (j=0; j<美元计数(ret)美元;$ j + +) { 如果($ j==count (ret)美元1){ $ new_ret [count (ret)美元1]=total_real_money - ret美元[count (ret)美元1]+ min_money美元; 其他}{ ,,,, 美元new_ret []=$ ret [$ j + 1] - ret [j]美元+ min_money美元; } } 洗牌($ new_ret); return 才能;new_ret美元; } function get_rand(开始,结束,美元马克斯美元){ ,,,$ tmp=兰德(开始,结束美元); ,,,total_max=美元开始+马克斯美元; ,,,, ,,,如果(tmp>美元;(total_max美元),| |,空(tmp)美元){ ,,,,,,,return get_rand(开始,结束,美元马克斯美元); 还有,,,}{ ,,,,,,,return tmp美元; ,,,} ,,,, }