发红包程序的设计

  • 代码
<?php

/**
 * 发红包
 * @param int $sum 要发放的总金额
 * @param int $number 要发放的人数
 * @return array  返回的数组是每个人对应的金额
 */
function devide_money($sum = 50, $number = 10)
{
    $arr = [];
    for ($i = 1; $i <= $number; $i++) {
        $arr[] = rand(10, 100);
    }
    $sum_money = array_sum($arr);
    echo '10-100之间随机数的总金额' . $sum_money;

    array_walk($arr, function (&$item) use ($sum, $sum_money) {
        $item = $sum / $sum_money * $item;
        $item = sprintf('%.2f', $item);
    });
    // 这时候的 array_sum($arr) 应该是一个接近50的值,因为有除法,我们取的是两位的小数
    // 与50比较,多或者少,都给最后一个用户
    $result_sum = array_sum($arr);
    echo '<br> 红包发放到每个人的原始总值' . $result_sum;
    if ($result_sum !== $sum) {
        $diff = $sum- $result_sum; // 如果是正数,表述有多余的,负数,表示值多算了
        // 获取最后一个值,并更改
        end($arr); // 注意 end key 函数必须单独写,而不能放在一块
        $last_key = key($arr);
        $last_value = $arr[$last_key];
        $arr[$last_key] = $last_value + $diff;
    }
    echo '<br> 更新最后一个人的红包金额后的总值' . array_sum($arr);
    return $arr;
}

$res = devide_money();
echo '<pre>';
print_r($res);
image.png
  • 设计思路
  • 保证每个红包都是公平的随机值,rand(10, 100);
  • 红包生成后会有一个总金额 sum_money,这个金额肯定和我们输入的金额 sum 不对等
  • 解决每个红包金额比例对等问题 sum/sum_money*$item
  • 这时候的总金额与输入的红包金额值是接近的,要解决差额的问题,处理到最后一个红包

领取红包

领取红包可以直接 array_pop($arr) 这种方式领取,不过如果你想重新打乱红包的顺序,建议有两种方式

注意 array_rand 取出来的是键
<?php
$input = array("Neo", "Morpheus", "Trinity", "Cypher", "Tank");
$rand_keys = array_rand($input, 2);
echo $input[$rand_keys[0]] . "\n";
echo $input[$rand_keys[1]] . "\n";
?>
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容