把一个数随机分成n份,随机数字和等于这个数字

一、100个数随机分成10份:

说明:

1、此算法$money_total值可大于 $personal_num 也可以小于$personal_num;

2、得出来的结果是保留两位小数点;

3、相加和等于100;可用于发红包,精准到小数;

4、值类型结果是string(字符串);

$money_total=100;
$personal_num=10;
$min_money=0.01;
$money_right=$money_total;
$randMoney=[];
for($i=1;$i<=$personal_num;$i++){
    if($i== $personal_num){
        $money=$money_right;
    }else{
        $max=$money_right*100 - ($personal_num - $i ) * $min_money *100;
        $money= rand($min_money*100,$max) /100;
        $money=sprintf("%.2f",$money);
        }
        $randMoney[]=$money;
        $money_right=$money_right - $money;
        $money_right=sprintf("%.2f",$money_right);
}
shuffle($randMoney);
var_dump($randMoney);

运行结果:

  1. array (size=10)
  2.   0 => string '54.91' (length=5)
  3.   1 => string '3.02' (length=4)
  4.   2 => string '4.59' (length=4)
  5.   3 => string '12.76' (length=5)
  6.   4 => string '0.02' (length=4)
  7.   5 => string '22.83' (length=5)
  8.   6 => string '0.01' (length=4)
  9.   7 => string '0.01' (length=4)
  10.   8 => string '0.01' (length=4)
  11.   9 => string '1.84' (length=4)

 

二、100随机分成5份:

说明:

1、此算法$total_money值必须大于$total_num;

2、得出来的结果是整数;

3、相加和等于100;

4、值类型结果是int(整型);

<?php
$total_money=100;
$total_num=5;
$total_money=$total_money - $total_num;
for($i=$total_num;$i>0;$i--){
    $data[$i]=1;
    $ls_money=0;
    if($total_money>0){
        if($i==1){
            $data[$i] +=$total_money;
        }else{
            $max_money=floor($total_money/$i);
            $ls_money=mt_rand(0,$max_money);
            $data[$i]+=$ls_money;
        }
    }
    $total_money -= $ls_money;
}
var_dump($data);

运算结果:

  1. array (size=5)
  2.   5 => int 5
  3.   4 => int 17
  4.   3 => int 23
  5.   2 => int 9
  6.   1 => int 46

 

三、6人随机分成3组

<?php
$div=3; //分成几组
$total=6; //总数
$a=range(0,$div-1);
$base=($total-array_sum($a))/$div;
for($len=count($a),$i=0; $i<$len; $i++){
    $a[$i]+=$base;
}
shuffle($a); //打乱排序
var_dump($a);//$a中便是分的不等数

运行结果:

  1. array (size=3)
  2.   0 => int 2
  3.   1 => int 3
  4.   2 => int 1
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值