学习记录--微信红包

2016-07-05 16:38:21 +08:00
 z21victor

好久之前写的了,太懒了。 不管水平如何都要记录一下,哎! 看了 timyang 的文章,有感而发。

$total=20;

$num=16;

$min=0.01;

for ($i=1;$i<$num;$i++){

$n = $num-$i+1;

$newTotal = ($total/$n)*2;

$money = mt_rand($min*100,$newTotal*100)/100;

$total = $total-$money;

echo '第'.$i.'个:'.$money.' 元,剩余:'.$total.' 元 <br/>';

}

echo '第'.$num.'个:'.$total.' 元,剩余: 0 元';

3599 次点击
所在节点    PHP
13 条回复
ersic
2016-07-05 16:57:23 +08:00
假如,一百块钱的红包十个人分,最优只能是二十呗?
微信好像不是这样的。
z21victor
2016-07-05 16:58:53 +08:00
@ersic 随机生成,符合正态分布,但是最后一个红包会大概率大点
madao
2016-07-05 17:02:17 +08:00
不符合,应该是这样,假设最小可得的值为 x 人数为 n 总钱数为 a

第一个则为 rand(a-(n*x)) 得到 r1
第二个则为 rand(a-r1-((n-1)*x))

这样事实上期望值是差不多的(违反直觉对吧)。
z21victor
2016-07-05 17:02:46 +08:00
@ersic 我知道你的意思了,我这边说每次的红包金额是,最大是每人可分钱的平均数乘以 2 ,最小是 0.01 。在这区间去随机。
madao
2016-07-05 17:03:41 +08:00
这个实际讨论很多: https://www.zhihu.com/question/22625187
z21victor
2016-07-05 17:04:47 +08:00
@madao 这个我也是猜测,可能是看了那个博文,思想被固定住了。
crystom
2016-07-05 17:08:51 +08:00
我感觉应该在一条线段上随机区 N-1 个点,以切为 N 段,每段长度对应份额。
这样比较符合微信实际情况,赢者通吃的概率很大
guizer
2016-07-05 18:14:37 +08:00
我感觉应该是 (红包剩余金额-红包剩余个数*0.01 ) 在这个里面随机的
guizer
2016-07-05 18:18:02 +08:00
@guizer 然后个数为 1 就取全部
guoer
2016-07-06 00:09:05 +08:00
记录不是叫你发帖呀
burn
2016-07-06 01:05:35 +08:00
如果不设置 $newTotal = ($total/$n)*2 - $min;

那么有可能红包分到倒数第二个就分光了 ,最后一个只能拿到 0 元
z21victor
2016-07-06 08:54:42 +08:00
@guoer 好,不能删帖,我换地方记录。见谅了
z21victor
2016-07-06 08:56:23 +08:00
@burn 我也是这么想的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/290435

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX