好久之前写的了,太懒了。 不管水平如何都要记录一下,哎! 看了 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 元';
1
ersic 2016-07-05 16:57:23 +08:00
假如,一百块钱的红包十个人分,最优只能是二十呗?
微信好像不是这样的。 |
3
madao 2016-07-05 17:02:17 +08:00
不符合,应该是这样,假设最小可得的值为 x 人数为 n 总钱数为 a
第一个则为 rand(a-(n*x)) 得到 r1 第二个则为 rand(a-r1-((n-1)*x)) 这样事实上期望值是差不多的(违反直觉对吧)。 |
4
z21victor OP @ersic 我知道你的意思了,我这边说每次的红包金额是,最大是每人可分钱的平均数乘以 2 ,最小是 0.01 。在这区间去随机。
|
5
madao 2016-07-05 17:03:41 +08:00
这个实际讨论很多: https://www.zhihu.com/question/22625187
|
7
crystom 2016-07-05 17:08:51 +08:00
我感觉应该在一条线段上随机区 N-1 个点,以切为 N 段,每段长度对应份额。
这样比较符合微信实际情况,赢者通吃的概率很大 |
8
guizer 2016-07-05 18:14:37 +08:00
我感觉应该是 (红包剩余金额-红包剩余个数*0.01 ) 在这个里面随机的
|
10
guoer 2016-07-06 00:09:05 +08:00
记录不是叫你发帖呀
|
11
burn 2016-07-06 01:05:35 +08:00
如果不设置 $newTotal = ($total/$n)*2 - $min;
那么有可能红包分到倒数第二个就分光了 ,最后一个只能拿到 0 元 |