微信红包java算法代码 java微信红包实现( 五 )


}
//维护策略的环境类
class RedPackageBuilder
{
// 实例
protected static $_instance = null;
/**
* Singleton instance(获取??的实例)
*
* @return MemcacheOperate
*/
public static function getInstance()
{
if (null === self::$_instance)
{
self::$_instance = new self();
}
return self::$_instance;
}
/**
* 获取策略【使?反射】
*
* @param string $type 类型
* @return void
*/
public function getBuilderStrategy($type) {
$class = $type.'PackageStrategy';
if(class_exists($class))
return new $class();
}
else
{
throw new Exception("{$class} 类不存在!");
}
}
public function getRedPackageByDTO(OptionDTO $optionDTO)
{
//获取策略
$builderStrategy = $this-getBuilderStrategy($optionDTO-builderStrategy); //设置参数
$builderStrategy-setOption($optionDTO);
return $builderStrategy-create();
}
}
class Client
{
public static function main($argv)
{
//固定红包
$dto = OptionDTO::create(1000,10,100,100,'Equal');
$data = https://www.04ip.com/post/RedPackageBuilder::getInstance()-getRedPackageByDTO($dto);
//print_r($data);
//随机红包[修数据]
$dto = OptionDTO::create(5,10,0.01,0.99,'RandTriangle');
$data = https://www.04ip.com/post/RedPackageBuilder::getInstance()-getRedPackageByDTO($dto); print_r($data);
//随机红包[不修数据]
$dto = OptionDTO::create(5,10,0.01,0.99,'RandTriangle','Can_Left');
$data = https://www.04ip.com/post/RedPackageBuilder::getInstance()-getRedPackageByDTO($dto);
//print_r($data);
}

5.9
百度文库VIP限时优惠现在开通,立享6亿+VIP内容
立即获取
微信红包随机数字_微信随机红包数详解和算法代码
微信红包随机数字_微信随机红包数详解和算法代码
1 需求
写?个固定红包 + 随机红包
固定红包就是每个红包?额?样,有多少个就发多少个固定红包?额就? 。
随机红包的需求是 。?如红包总?额5元,需要发10个红包 。随机范围是 0.01到0.99;5元必需发完,?额需要有?定趋势的正态分布 。
(0.99可以任意指定,也可以是 avg * 2 - 0.01;?如avg = 5 / 10 = 0.5;(avg * 2 - 0.01 = 0.99))
第 1 页
2 需求分析
2.1 固定红包
如果是固定红包,则算法是?条直线 。t就是固定红包的额度 。如图 。
f(x) = t;(1 = x = num)
image.png
2.2 随机红包
如果我们使?随机函数rand 。rand(0.01,0.99);那么10次随机 , 如果最坏情况都是?额0.99,总?额就是9.9元 。会超过5元 。?额也会不正态分布 。最后思考了?下借助与数学函数来当作随机红包的发?器,可以?抛物线,三?函数 。最后选定了等腰三?线性函数 。
第 2 页
1 算法原理
如果需要发红包总?额是totalMoney,红包个数是num个,?额范围是[min,max],线性?程如图 。
image.png
三个点的坐标:
(x1,y1) = (1,min)
(x2,y2) = (num/2,max)
(x3,y3) = (num,min)
确定的线性?程:
$y = 1.0 * ($x - $x1) / ($x2 - $x1) * ($y2 - $y1) + $y1 ; (x1 = x = x2)
第 3 页
$y = 1.0 * ($x - $x2) / ($x3 - $x2) * ($y3 - $y2) + $y2; (x2 = x = x3)
修数据:
y(合) = y1 + y2 + y3 +...... ynum;
y(合)有可能totalMoney  , 说明?成?额多了,需要修数据,则从(y1,y2,y3.....ynum)这些每次减少0.01 。直到y(合) = totalMoney 。
y(合)有可能totalMoney,说明?成?额少了,需要修数据,则从(y1,y2,y3.....ynum)这些每次加上0.01 。直到y(合) = totalMoney 。
第 4 页
2 算法原理样例
如果需要发红包总?额是11470,红包个数是7400个,?额范围是[0.01,3.09] , 线性?程如图 。

推荐阅读