永发信息网

php如何把一个数分成N份

答案:4  悬赏:30  手机版
解决时间 2021-02-27 19:39
  • 提问者网友:泪痣哥哥
  • 2021-02-26 20:40
php如何把一个数分成N份
最佳答案
  • 五星知识达人网友:怙棘
  • 2021-02-26 21:53
很简单,代码如下:
function splitNumber(num:uint,block:uint):void {
        if (num < block) {
                throw new Error("block must larger than num");
        }
        var i:uint;
        var sp:uint;
        var arr:Array = new Array();
        for (i = 1; i < block; i ++) {
                if (num == block - i + 1) {
                        var j = i;
                        while (j++ < block) {
                                arr.push(1);
                        }
                        num = 1;
                        break;
                } else {
                        sp = Math.ceil(Math.random() * (num - block + i));
                        arr.push(sp);
                        num -= sp;
                }
        }
        arr.push(num);
        trace(arr);
}

function t(e:Event) {
        splitNumber(10,5);
}
this.addEventListener(Event.ENTER_FRAME,t);
全部回答
  • 1楼网友:笑迎怀羞
  • 2021-02-26 23:45
假设你需要N份
用PHP随机出来(100除以N)为最大值的(N-1)个数据;
最后一个数据就是100减去前四个数据之和;
---------------------------------------------
如分成5份;
100/5=20;
那么随机出来5-1=4 个整数,随机出来的四个整数不能超过20;
再用100-这四个随机数之和;得数是第五个数;
OK;;追问感谢您的回答,您这是纯随机的分成N个数是吧,代码该如何写呢?谢谢!
  • 2楼网友:污到你湿
  • 2021-02-26 22:24
$div=5;
$total=100;
$a=range(0,$div-1);
$base=($total-array_sum($a))/$div;
for($len=count($a),$i=0; $i<$len; $i++){
$a[$i]+=$base;
}
var_dump($a);//$a中便是分的不等数array (size=5)
  0 => int 18
  1 => int 19
  2 => int 20
  3 => int 21
  4 => int 22
想了个算法,依次对每一份加0,1,2,3,4肯定会不同追问非常感谢您的解答,算法非常好,如果我要纯随机的分成5份,不考虑差距的问题呢?追答//随机整型利用“不同”就有顺序的原理,
function randomDivInt($div,$total){
$remain=$total;
$max_sum=($div-1)*$div/2;
$p=$div; $min=0;
$a=array();
for($i=0; $i<$div-1; $i++){
$max=($remain-$max_sum)/($div-$i);
$e=rand($min,$max);
$min=$e+1; $max_sum-=--$p;
$remain-=$e;
$a[$e]=true;
}
$a=array_keys($a);
$a[]=$remain;
return $a;
}

for($i=0; $i<3; $i++){
$a=randomDivInt(5,100);
var_dump($a);//$a中便是分的不等数
var_dump(array_sum($a));
}array (size=5)
  0 => int 4
  1 => int 9
  2 => int 10
  3 => int 15
  4 => int 62
int 100
array (size=5)
  0 => int 12
  1 => int 13
  2 => int 23
  3 => int 24
  4 => int 28
int 100
array (size=5)
  0 => int 13
  1 => int 20
  2 => int 21
  3 => int 22
  4 => int 24
int 100
  • 3楼网友:舍身薄凉客
  • 2021-02-26 22:05

大致思路
1)取份数的平均值
2)根据允许的各份数间最大差值,动态调整随机数范围,形成各份的数量
3)最后一份的数量由前面已经分出的决定,以保证各份的总和为指定值
 
代码如下:$total = 100; //待划分的数字
$div = 5; //分成的份数
$area = 10; //各份数间允许的最大差值
$average = round($total / $div);
$sum = 0;
$result = array_fill( 1, $div, 0 );
for( $i = 1; $i < $div; $i++ ){
 //根据已产生的随机数情况,调整新随机数范围,以保证各份间差值在指定范围内
 if( $sum > 0 ){
  $max = 0;
  $min = 0 - round( $area / 2 );
 }elseif( $sum < 0 ){
  $min = 0;
  $max = round( $area / 2 );
 }else{
  $max = round( $area / 2 );
  $min = 0 - round( $area / 2 );
 }
 //产生各份的份额
 $random = rand( $min, $max );
 $sum += $random;
 $result[$i] = $average + $random;
}
//最后一份的份额由前面的结果决定,以保证各份的总和为指定值
$result[$div] = $average - $sum;
//结果呈现
echo '划分情况:
';
foreach( $result as $temp ){
 echo $temp, '
';
}
echo '总和:', array_sum( $result );
exit;
?>
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯