0

0

PHP用抛物线的模型实现微信红包生成算法的程序源码

不言

不言

发布时间:2018-04-20 12:36:43

|

2292人浏览过

|

来源于php中文网

原创


今天研究了一下红包的生成算法,看似觉得简单,实际弄起来不是那么回事,当然如果只是觉得用个rand生成几个随机数的话,那也就没有什么意义了。

发红包应该有点讲究啊,得让分配的所有人都能拿到非0的红包,同时要让大多数人拿到平均值左右的红包。

其它也不多说了,我在程序里已经写了很多的注释,上代码如下:

rewardArray=array();
	 }
	 
	 #执行红包生成算法
	 public function splitReward($rewardMoney,$rewardNum,$scatter=100)
	 {
		 	#传入红包金额和数量
		 	$this->rewardMoney=$rewardMoney;
			$this->rewardNum=$rewardNum;
			$this->scatter=$scatter;
			$this->realscatter=$this->scatter/100;
			
			/*
			 *前言:今天我突然这样一想,比如要把1个红包分给N个人,实际上就是相当于要得到N个百分比数据
			 *     条件是这N个百分比之和=100/100。这N个百分比的平均值是1/N。
			 *     并且这N个百分比数据符合一种正态分布(多数值比较靠近平均值)
			 *观点:微信红包里很多0.01的红包,我觉得这是微信程序里的人为控制,目的是为了防止总红包数超过总额,先分了几个0.01的红包。
			 *     不然不管是以随机概率还是正态分布都很难会出现非常多的0.01元红包。
			 */
			
			#我的思路:正如上面说的,比如:1个红包发给5个人,我要得出5个小数,它们的和是1,他们的平均值是1/5
			#计算出发出红包的平均概率值、精确到小数4位。即上面的1/N值。
			$avgRand=round(1/$this->rewardNum,4);
			 
			#红包的向平均数集中的分布正像数学上的抛物线。抛物线y=ax2,|a|越大则抛物线的开口就越小,|a|越小则抛物线的开口就越大,a>0时开口向上,我们这都是正数,就以a>0来考虑吧。
			#程序里的$scatter值即为上方的a,此值除以100,当做100为基准,
			#通过开方(数学里的抛物线模型,开方可缩小变化值)得出一个小数字较多(小数字多即小红包多)的随机分布,据此生成随机数
			$randArr=array();
			while(count($randArr)<$rewardNum)
			{
					$t=round(sqrt(mt_rand(1,10000)/$this->realscatter));
					$randArr[]=$t;
			}
			
			#计算当前生成的随机数的平均值,保留4位小数
			$randAll=round(array_sum($randArr)/count($randArr),4);
			
			#为将生成的随机数的平均值变成我们要的1/N,计算一下生成的每个随机数都需要除以的值。我们可以在最后一个红包进行单独处理,所以此处可约等于处理。
			$mixrand=round($randAll/$avgRand,4);
			
			#对每一个随机数进行处理,并剩以总金额数来得出这个红包的金额。
			$rewardArr=array();
			foreach($randArr as $key=>$randVal)
			{
					$randVal=round($randVal/$mixrand,4);
					$rewardArr[]=round($this->rewardMoney*$randVal,2);
			}
			
			#对比红包总数的差异、修正最后一个大红包
			sort($rewardArr);
			$rewardAll=array_sum($rewardArr);
			$rewardArr[$this->rewardNum-1]=$this->rewardMoney-($rewardAll-$rewardArr[$this->rewardNum-1]);
			rsort($rewardArr);

			#对红包进行排序一下以方便在前台图示展示
			foreach($rewardArr as $k=>$value)
			{
					$t=$k%2;
					if($t) array_push($this->rewardArray,$value);
					else array_unshift($this->rewardArray,$value);
			}
			$rewardArr=NULL;
			return $this->rewardArray;
	 }
	
}

$money=1000;	#总共要发的红包数;
$people=50;		#总共要发的人数
$scatter=100;    #分散度
$reward=new reward();
$rewardArr=$reward->splitReward($money,$people,$scatter);
echo "发放红包个数:{$people},红包总金额{$money}元。下方所有红包总额之和:".array_sum($reward->rewardArray).'元。下方用图展示红包的分布';
echo '
'; echo ""; foreach($rewardArr as $val) { #线条长度计算 $width=intval($people*$val*300/$money); echo ""; } echo "
红包金额图示
{$val}
"; ?>


Originality AI
Originality AI

专门为网络出版商设计的抄袭和AI检测工具

下载

在上传的文件里需要改一下54行:$t=round(sqrt(mt_rand(1,10000)/$this->realscatter));,要控制值不为能0,我改成了1,没有测试,可能需要改大点,因为开方后的数值会缩小。也可以对这行的值直接进行ceil处理, 就不会出现红包为0的数了。

对于scatter的值我没有多做研究,不过根据抛物线的数学模型,这个值的意义可以使抛物线的张口放大缩小,即可以让红包的值分散或者集中

相关推荐:

php微信公众号开发之现金红包


相关文章

微信app下载
微信app下载

微信是一款手机通信软件,支持通过手机网络发送语音短信、视频、图片和文字。微信可以单聊及群聊,还能根据地理位置找到附近的人,带给大家全新的移动沟通体验,有需要的小伙伴快来保存下载体验吧!

下载

相关标签:

php

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
c++ 根号
c++ 根号

本专题整合了c++根号相关教程,阅读专题下面的文章了解更多详细内容。

22

2026.01.23

c++空格相关教程合集
c++空格相关教程合集

本专题整合了c++空格相关教程,阅读专题下面的文章了解更多详细内容。

24

2026.01.23

yy漫画官方登录入口地址合集
yy漫画官方登录入口地址合集

本专题整合了yy漫画入口相关合集,阅读专题下面的文章了解更多详细内容。

99

2026.01.23

漫蛙最新入口地址汇总2026
漫蛙最新入口地址汇总2026

本专题整合了漫蛙最新入口地址大全,阅读专题下面的文章了解更多详细内容。

132

2026.01.23

C++ 高级模板编程与元编程
C++ 高级模板编程与元编程

本专题深入讲解 C++ 中的高级模板编程与元编程技术,涵盖模板特化、SFINAE、模板递归、类型萃取、编译时常量与计算、C++17 的折叠表达式与变长模板参数等。通过多个实际示例,帮助开发者掌握 如何利用 C++ 模板机制编写高效、可扩展的通用代码,并提升代码的灵活性与性能。

15

2026.01.23

php远程文件教程合集
php远程文件教程合集

本专题整合了php远程文件相关教程,阅读专题下面的文章了解更多详细内容。

65

2026.01.22

PHP后端开发相关内容汇总
PHP后端开发相关内容汇总

本专题整合了PHP后端开发相关内容,阅读专题下面的文章了解更多详细内容。

61

2026.01.22

php会话教程合集
php会话教程合集

本专题整合了php会话教程相关合集,阅读专题下面的文章了解更多详细内容。

63

2026.01.22

宝塔PHP8.4相关教程汇总
宝塔PHP8.4相关教程汇总

本专题整合了宝塔PHP8.4相关教程,阅读专题下面的文章了解更多详细内容。

33

2026.01.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
前端开发(基础+实战项目合集)
前端开发(基础+实战项目合集)

共60课时 | 3.9万人学习

MongoDB 教程
MongoDB 教程

共42课时 | 26.7万人学习

JavaScript OOP调试技巧视频教程
JavaScript OOP调试技巧视频教程

共5课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号