红包算法

$money = 10;    // 红包大小
$num   = 10;      // 红包个数
$min   = 0.01; // 单个红包最低金额

$ret = lottery($money, $num, $min);
if (! is_array($ret)) {
    exit($ret.PHP_EOL);
}

echo '手气最佳:'.max($ret).PHP_EOL;
echo '手气最差:'.min($ret).PHP_EOL;
echo PHP_EOL;

print_r($ret);

//----------------------------------------------------------------------

// 产生一个随机浮点数
function random_float($min = 0, $max = 1)
{
    return round($min + mt_rand() / mt_getrandmax() * ($max - $min), 2);
}

// 微信随机红包模拟算法
function lottery($sum_money, $num, $min_money = 0.01)
{
    if ($sum_money < $num * $min_money) {
        return '钱不够';
    }

    $list = [];
    for ($i = 1; $i <= $num; $i++) {
        // 剩余的可分配金额,需要确保剩下的人每人都至少可以拿到保底的钱
        $remain = $sum_money - array_sum($list) - ($num - $i + 1) * $min_money;

        if ($i < $num) {  // 前面的人随机获得
            // 每轮抽取的金额范围:0 至 剩余金额平均值的两倍
            $get = random_float(0, $remain / ($num - $i + 1) * 2);
        } else {  // 最后一个人拿全部剩下的
            $get = $remain;
        }

        // 最后再将每个人保底的钱加上
        $list[] = round(round($get, 2)   + $min_money, 2);
    }

    return $list;
}

 

posted @ 2019-09-18 09:57  za_szybko  阅读(334)  评论(0编辑  收藏  举报