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

我正在尝试针对“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 等。我可以这样做吗?


慕哥9229398
浏览 116回答 1
1回答

长风秋雁

但我想生成整数的随机数。因为它 生成所有随机数后,剂量与实际数量不符 如果我们将生成的随机数相加,则得到数字。就像如果我生成 数量为 100 的随机数,然后是所有生成的总和 随机数应该是 100。这就是我真正想要的。我从你的陈述中得到的是,你想要 100 个带有 2 位小数的浮点数,所有这些数字的总和应该为 100。这当然不是最干净的解决方案,但这里是:$total_days = 100;$total_amount = 100;$arr = array();for($i = 0; $i < $total_days; ++$i){&nbsp; &nbsp; $arr[] = rand(0.0, 1000.0);}$actual_sum = array_sum($arr);for($i = 0; $i < $total_days; ++$i){&nbsp; &nbsp; &nbsp; &nbsp; $y = $arr[$i] * ($total_amount /$actual_sum);&nbsp; &nbsp; &nbsp; &nbsp; $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 keyunset($arr[$maxElementKeys[0]]); //remove the max element from array, now the array contains 99 elements$arr = array_values($arr); //rebase the keysfor($i = 0; $i < $total_days; ++$i)&nbsp;{&nbsp;&nbsp;&nbsp; &nbsp; if($i < ($total_days - 1) )&nbsp; &nbsp; &nbsp; &nbsp; $value = $arr[$i];&nbsp;&nbsp; &nbsp; else&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; $value = $total_amount - array_sum($arr); //to get the 100th number, subtract from 100 to ensure the total always adds up to 100&nbsp; &nbsp; $genpackageroi = array(&nbsp; &nbsp; &nbsp; &nbsp; 'userid' => $userid,&nbsp; &nbsp; &nbsp; &nbsp; 'pkgid' => $pkgid,&nbsp; &nbsp; &nbsp; &nbsp; 'pkgcount' => $pkcount,&nbsp; &nbsp; &nbsp; &nbsp; 'amount' => $value,&nbsp; &nbsp; &nbsp; &nbsp; 'created_at' => $created_at,&nbsp; &nbsp; &nbsp; &nbsp; 'updated_at' => $updated_at,&nbsp; &nbsp; );&nbsp; &nbsp; DB::table('genpackageroi')->insert($genpackageroi);}这里的逻辑是将所有数字四舍五入为 2dps。在大多数情况下,其总数会超过 100 几个 dps。 接下来,获取数组中最大的随机数,并将其从数组中删除,使其成为包含 99 个元素的数组。删除最大数是为了确保新数组的总和保持在 100 以下。因此,要获取第 100 个元素,请获取新数组的总和并从 100 中减去该值。现在,所有元素的总和数组的 和刚刚计算的第 100 个元素的总和应该正好为 100,失败的可能性可以忽略不计。
打开App,查看更多内容
随时随地看视频慕课网APP