浏览文章

文章信息

PHP随机评论| 随机几个数的和是一个定值|PHP”随机数相加等于固定值“|rand int sum as a fix amount 438

性能更好的版本(推荐):

/**
     * @DESC          # 获取随机
     *
     * @AUTH    秋枫雁飞
     * @EMAIL aiweline@qq.com
     * @DateTime: 2022/9/8 23:25
     * 参数区:
     *
     * @param int $item_num
     * @param int $total
     * @param int $min
     * @param int $max
     *
     * @return array
     */
    function getRatingItemValue(int $item_num = 5, int $total = 20, int $min = 0, int $max = 5): array
    {
        $items = [];
        $avg   = intval(floor($total / $item_num));
        for ($i = 0; $i < $item_num; $i++) {
            $items[] = random_int($min, $avg);
        }
        $last = $total - array_sum($items);
        foreach ($items as $item) {
            if ($item > $max) {
                return $this->getRatingItemValue($item_num, $total, $min, $max);
            }
        }
        if ($last > $max) {
            return $this->getRatingItemValue($item_num, $total, $min, $max);
        }
        $items[] = $last;
        return $items;
    }


怎么用PHP产生n个数,并让其和为定值

示例:

/**
     * @DESC          # 获取随机评论
     *
     * @AUTH    秋枫雁飞
     * @EMAIL aiweline@qq.com
     * @DateTime: 2022/9/8 23:05
     * 参数区:
     *
     * @param int $count [随机数个数]
     * @param int $sum   [随机数总和]
     * @param int $mix   [最小随机数]
     * @param int $max   [最大随机数]
     *
     * @return array
     */
    function getRand(int $count = 5, int $sum = 5, int $mix = 0, int $max = 5): array
    {
        ini_set('memory_limit', '1024M');
        $i = 1;
        while ($i <= $count) {
            $tmp[] = mt_rand($mix, $max);
            $i++;
        }
        $k   = $sum / array_sum($tmp);
        $res = [];
        foreach ($tmp as $v) {
            $res[] = (int)($v * $k);
        }
        $assoc = $sum - array_sum($res);
        $last  = array_pop($res);
        $res[] = $last + $assoc;
        while (max($res) > $max) {
            $tmax = max($res);
            $key  = array_search($tmax, $res);
            if ($key !== false) {
                $res[$key] = mt_rand($mix, $max);
                $k         = array_search(min($res), $res);
                $res[$k]   = $tmax - $res[$key] + min($res);
            }
        }
        return $res;
    }


原创