本文描述了用PHP实现的随机红包算法。分享给大家参考,如下:
一、总体设计
算法有很多种,可以自己选择。主要的‘架构’是这样的。redis decr()命令用来限制电流,而mysql用来记录各种需要的数据
二、红包算法
为简单起见,红包的金额用整数表示。假设每个红包里有X颗甜豆,每人至少一颗
第一个:的每个红包最大金额为:(剩余金额/剩余红包数)*2,开始需要提前给每个人分配一个bean
函数randBean($total_bean,$ total _ packet){ $ min _ bean=1;$ max _ bean=5000$ range=2;$ total _ bean=$ total _ bean-$ total _ packet * $ min _ bean;//每个人预留一个最低值$ list=[];$ min=1;while(count($ list)$ total _ packet){ $ max=floor($ total _ bean/$ total _ packet)* $ range;$bean=rand($min,$ max);if($ bean=$ max _ bean-1){ $ list[]=$ bean;$ total _ bean-=$ bean;} } $ list[]=$ total _ bean;//剩下的金豆作为最后一个红包。//Merge foreach($ list as $ k=$ v){ $ list[$ k]=$ min _ bean;}返回$ list}多个统计数据
第二,简单扩展一下。每个红包最高金额为:(剩余金额/剩余红包)* 3;但是要求一次至少发2个红包
第三,线段法随机生成几个数字,把一条直线分成几段,每段的长度(这个波动比较大,不是很平均,如果每个红包的大小有限会比较麻烦)
函数abc ($total_bean,$ total _ packet){ $ min=1;$ max=$ total _ bean-1;$ list=[];$ MaxLength=$ total _ packet-1;while(count($ list)$ maxLength){ $ rand=mt _ rand($ min,$ max);空($ list[$ rand])($ list[$ rand]=$ rand);} $ list[0]=0;//第一个$ list[$ total _ bean]=$ total _ bean;//最后排序($ list);//索引$ bean=[]不再保留;for($ j=1;$ j=$ total _ packet$ j){ $ beans[]=$ list[$ j]-$ list[$ j-1];} //返回$ beans回声“pre”;print _ r($ bean);echo array _ sum($ bean);}abc(100000,3);第四个:
因为每个人至少有一个bean,所以每次随机生成bean的数量时,应该保留剩余的数量*1个bean;
去掉必须剩下的豆子数后,取剩余豆子数的平均值作为最大值,随机生成当前豆子数
PS:这里有两个功能类似的在线工具,供大家参考:
在线随机数/字符串生成工具:http://tools.jb51.net/aideddesign/suijishu
在线随机字符/随机密码生成工具:http://tools.jb51.net/aideddesign/rnd_password
更多对PHP相关内容感兴趣的读者可以查看本网站专题:《PHP数学运算技巧总结》、《php字符串(string)用法总结》、《PHP数据结构与算法教程》、《php程序设计算法总结》、《PHP数组(Array)操作技巧大全》、《php常见数据库操作技巧汇总》、0103010
希望本文对PHP编程有所帮助。