微信红包算法-php代码

来源:互联网 发布:windows 网络重置 编辑:程序博客网 时间:2024/05/19 14:38
今天看见一篇文章说微信红包的算法,大致是说微信红包的金额是随机生成的,而且是在最小0.01 到 剩余平均值 * 2之间. 感觉挺有意思的, 我用php的代码初步实现下.
class hongbao{public $size;public $money;public function __construct($size=10, $money=100){$this->size = $size;$this->money = $money;}}class suanfa{public static function weixin_hongbao(hongbao $hongbao){$result = array();while ($hongbao->size) {if ($hongbao->size == 1){// 最后一个就不用随机了--$hongbao->size;$result[] = $hongbao->money;return $result;}// 最小金额$min = 0.01;// round是为了让数据好看点,毕竟浮点数运算不准确$max = $hongbao->money / $hongbao->size *2;$money = mt_rand(1, $max * 100) / 100;$money = round( $money <= $min ? $min : $money, 2);--$hongbao->size;$hongbao->money -= $money;$result[] = $money;}return $result;}}




再测试下吧:
$sum = array(0,0,0,0,0,0,0,0,0,0);for($i=0; $i<1000000; $i++){$res = suanfa::weixin_hongbao(new hongbao());$sum[0] += $res[0];$sum[1] += $res[1];$sum[2] += $res[2];$sum[3] += $res[3];$sum[4] += $res[4];$sum[5] += $res[5];$sum[6] += $res[6];$sum[7] += $res[7];$sum[8] += $res[8];$sum[9] += $res[9];}echo "<pre>";print_r($sum);echo "</pre>";

结果还是很符合随机的:
Array(    [0] => 9990770.7299997    [1] => 9998308.1599992    [2] => 10010790.76    [3] => 9998949.2799996    [4] => 10000814.14    [5] => 10000397.44    [6] => 10015352.29    [7] => 10010060.159999    [8] => 9986673.2899996    [9] => 9987883.7500001)


至于为什么小数点后面会有这么多位, 因为php的float运算不准确...

原文链接
0 0
原创粉丝点击