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

Php 100天内针对特定金额的随机浮动,php,laravel,random,Php,Laravel,Random,我试图在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 =

我试图在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);

        }
$total_days=100;
$total_金额=100;
$arr=array();
对于($i=0;$i<$total_天;++$i)
{
$arr[]=兰特(0.0,1000.0);
}
$actual_sum=数组_sum($arr);
对于($i=0;$i<$total_天;++$i)
{
$arr[$i]*=$total\u amount/$actual\u sum;
//回声$arr[$i]。“

”; $value=$arr[$i]; $genpackageroi=数组( “userid”=>$userid, “pkgid”=>pkgid美元, “pkgcount”=>pkcount美元, “金额”=>$value, 'created_at'=>$created_at, 'updated_at'=>$updated_at, ); DB::table('genpackageroi')->insert($genpackageroi); }
随机生成的值类似于0.1245444或1.1245545,小数点后有很多数字。我只想让它以浮点值生成,比如1.21,0.10,2.25。我知道有可能吗

但是我想用整数生成随机数。因为它 生成所有随机变量后,剂量与实际量不匹配 如果我们对生成的随机数求和。就好像我在做什么 随机数的数量为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);
}
$total_days=100;
$total_金额=100;
$arr=array();
对于($i=0;$i<$total_天;++$i)
{
$arr[]=兰特(0.0,1000.0);
}
$actual_sum=数组_sum($arr);
对于($i=0;$i<$total_天;++$i)
{
$y=$arr[$i]*($total\u amount/$actual\u sum);
$arr[$i]=四舍五入($y,2);//将数字四舍五入为2 dp。所有数字之和可以大于100。
}
//哈克,逻辑解释如下
$maxElementKeys=数组_键($arr,max($arr))//获取max元素的密钥
未设置($arr[$maxElementKeys[0]])//从数组中删除max元素,现在该数组包含99个元素
$arr=数组_值($arr)//重新设置键的基址
对于($i=0;$i<$total_天;++$i)
{  
如果($i<($total_days-1))
$value=$arr[$i];
其他的
$value=$total_amount-array_sum($arr);//要获得第100个数字,请从100中减去,以确保总数始终等于100
$genpackageroi=数组(
“userid”=>$userid,
“pkgid”=>pkgid美元,
“pkgcount”=>pkcount美元,
“金额”=>$value,
'created_at'=>$created_at,
'updated_at'=>$updated_at,
);
DB::table('genpackageroi')->insert($genpackageroi);
}
这里的逻辑是将所有数字舍入为2dps。在大多数情况下,其总数将超过100个dps。
接下来,获取数组中的最大随机数,并将其从数组中移除,使其成为包含99个元素的数组。删除最大值以确保新阵列的总和保持在100以下。所以,要得到第100个元素,需要得到新数组的和,然后从100中减去该值。现在,数组的所有元素和刚刚计算的第100个元素的总数应该加起来正好是100,失败的可能性可以忽略不计。

在这里应用舍入函数(
'amount'=>舍入($value,2),
)对您不起作用吗?这是在生成数字之后才起作用的。但是我想用整数生成随机数。因为如果我们对生成的随机数求和,在生成所有随机数之后,它与实际数量不匹配。比如,如果我生成了数量为100的随机数,那么所有生成的随机数之和应该为100。这就是我真正想要的。哦,我不是数学专业的学生,所以我不能确定,但我觉得你想要达到的目标会很难。不过,我可以想出一种老套的方法。让我想一个解决办法,然后贴一个答案。请让我知道它是否有效。您可能需要重构以实现标准化。@user3532758感谢您提供的解决方案我已经查看了您发布的解决方案,并在那里对解决方案发表了评论。请看一下。是的,这正是我真正想要的。但这个解决方案还有另一个问题。当我用100天和100个数量执行它时,它工作得很好,但是当我增加天数或数量时,它会给我舍入值直到20或30行,之后它会给我很多dps的浮点值,最后的值也是一样的。比如,如果浮动的值来自第30行,比如0.645135489,那么它与第30行的值相同。另一个问题是,如果我在300天内加上100个金额,它会给出100个金额的“191.55”的总和。这是完全错误的。它应该正好是100或高达100,比如100.2左右。总的来说,这是一个伟大的工程与100的金额和100天。请看一看。@MuhammadNoman让我检查一下,当然我认为100是最大值,我甚至把它编码为99,所以应该改为
$total-1
。还要注意的是,计算是原样的,我没有改变计算的任何部分。但是,现在让我来看看,我对你的解决方案做了一点修改,它工作得非常完美。您手动给出了if($i<99)的值,并且我首先给出了变量的值,比如$total_days=365;然后从$total_days变量中减去1,比如:$total_daysElem=$total_days-1;并使用if($i<$total\u daysElem)和$value=$total\u amount-array\u sum($arr)更新if条件;它现在工作得很好。谢谢先生,您提供了一个很好的解决方案。我也会更新答案,我不应该从硬编码99开始:)