具体如下:
最近一直在微信群里体验红包功能,红包类型有两种:
1. 普通红包
2. 拼手气红包
普通红包就不用多解析了,大锅饭原理,平分。
拼手气红包讲的是手气(运气),有人可以抢到很多,有人抢的少得可怜,当然也不是先抢就一定多,说到底了就是随机。
想了想,自己写写看,能不能实现类似的功能(不敢说是算法)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
// $bonus_total 红包总金额
// $bonus_count 红包个数
// $bonus_type 红包类型 1=拼手气红包 0=普通红包
function
randBonus(
$bonus_total
=0,
$bonus_count
=3,
$bonus_type
=1){
$bonus_items
=
array
();
// 将要瓜分的结果
$bonus_balance
=
$bonus_total
;
// 每次分完之后的余额
$bonus_avg
= number_format(
$bonus_total
/
$bonus_count
, 2);
// 平均每个红包多少钱
$i
= 0;
while
(
$i
<
$bonus_count
){
if
(
$i
<
$bonus_count
-1){
$rand
=
$bonus_type
?(rand(1,
$bonus_balance
*100-1)/100):
$bonus_avg
;
// 根据红包类型计算当前红包的金额
$bonus_items
[] =
$rand
;
$bonus_balance
-=
$rand
;
}
else
{
$bonus_items
[] =
$bonus_balance
;
// 最后一个红包直接承包最后所有的金额,保证发出的总金额正确
}
$i
++;
}
return
$bonus_items
;
}
|
好吧,我们现在来体验一下
1
2
3
4
5
6
|
// 发3个拼手气红包,总金额是100元
$bonus_items
= randBonus(100, 3, 1);
// 查看生成的红包
var_dump(
$bonus_items
);
// 校验总金额是不是正确,看看微信有没有坑我们的钱
var_dump(
array_sum
(
$bonus_items
));
|
另一个使用数组实现的版本,原理差不多:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
function
sendRandBonus(
$total
=0,
$count
=3,
$type
=1){
if
(
$type
==1){
$input
= range(0.01,
$total
, 0.01);
if
(
$count
>1){
$rand_keys
= (
array
)
array_rand
(
$input
,
$count
-1);
$last
= 0;
foreach
(
$rand_keys
as
$i
=>
$key
){
$current
=
$input
[
$key
]-
$last
;
$items
[] =
$current
;
$last
=
$input
[
$key
];
}
}
$items
[] =
$total
-
array_sum
(
$items
);
}
else
{
$avg
= number_format(
$total
/
$count
, 2);
$i
= 0;
while
(
$i
<
$count
){
$items
[] =
$i
<
$count
-1?
$avg
:(
$total
-
array_sum
(
$items
));
$i
++;
}
}
return
$items
;
}
|
相关推荐:
基于php 随机数的深入理解
PHP实现迪菲赫尔曼密钥交换(Diffie–Hellman)算法
PHP生成迷宫及自动寻路算法详解