为了账号安全,请及时绑定邮箱和手机立即绑定

100 天 php 针对特定金额的随机浮动

100 天 php 针对特定金额的随机浮动

PHP
慕哥9229398 2023-12-15 10:37:34
我正在尝试针对“100”生成随机值100 天的价值金额。我正在用 for 循环尝试这种方式:        $total_days = 100;        $total_amount = 100;        $arr = array();        for($i = 0; $i < $total_days; ++$i)        {            $arr[] = rand(0.0, 1000.0);        }        $actual_sum = array_sum($arr);        for($i = 0; $i < $total_days; ++$i)        {            $arr[$i] *= $total_amount /$actual_sum;            //echo $arr[$i]."<BR><BR>";                        $value = $arr[$i];            $genpackageroi = array(                'userid' => $userid,                'pkgid' => $pkgid,                'pkgcount' => $pkcount,                'amount' => $value,                'created_at' => $created_at,                'updated_at' => $updated_at,            );            DB::table('genpackageroi')->insert($genpackageroi);        }随机生成的值类似于 0.1245444 或 1.1245545,小数点后有很多数字。虽然我只想以浮点值生成它,例如 1.21、0.10、2.25 等。我可以这样做吗?
查看完整描述

1 回答

?
长风秋雁

TA贡献1757条经验 获得超7个赞

但我想生成整数的随机数。因为它 生成所有随机数后,剂量与实际数量不符 如果我们将生成的随机数相加,则得到数字。就像如果我生成 数量为 100 的随机数,然后是所有生成的总和 随机数应该是 100。这就是我真正想要的。

我从你的陈述中得到的是,你想要 100 个带有 2 位小数的浮点数,所有这些数字的总和应该为 100。

这当然不是最干净的解决方案,但这里是:

$total_days = 100;

$total_amount = 100;

$arr = array();


for($i = 0; $i < $total_days; ++$i)

{

    $arr[] = rand(0.0, 1000.0);

}

$actual_sum = array_sum($arr);

for($i = 0; $i < $total_days; ++$i)

{

        $y = $arr[$i] * ($total_amount /$actual_sum);

        $arr[$i] = round($y, 2); //round the numbers to 2 dp. Sum of all numbers could be greater than 100.

}

//hack, logic explained below

$maxElementKeys = array_keys($arr, max($arr)); //get max element's key

unset($arr[$maxElementKeys[0]]); //remove the max element from array, now the array contains 99 elements

$arr = array_values($arr); //rebase the keys


for($i = 0; $i < $total_days; ++$i) 

{  

    if($i < ($total_days - 1) )

        $value = $arr[$i]; 

    else 

        $value = $total_amount - array_sum($arr); //to get the 100th number, subtract from 100 to ensure the total always adds up to 100

    $genpackageroi = array(

        'userid' => $userid,

        'pkgid' => $pkgid,

        'pkgcount' => $pkcount,

        'amount' => $value,

        'created_at' => $created_at,

        'updated_at' => $updated_at,

    );

    DB::table('genpackageroi')->insert($genpackageroi);

}

这里的逻辑是将所有数字四舍五入为 2dps。在大多数情况下,其总数会超过 100 几个 dps。 接下来,获取数组中最大的随机数,并将其从数组中删除,使其成为包含 99 个元素的数组。删除最大数是为了确保新数组的总和保持在 100 以下。因此,要获取第 100 个元素,请获取新数组的总和并从 100 中减去该值。现在,所有元素的总和数组的 和刚刚计算的第 100 个元素的总和应该正好为 100,失败的可能性可以忽略不计。


查看完整回答
反对 回复 2023-12-15
  • 1 回答
  • 0 关注
  • 52 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信