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);
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个数是吧,代码该如何写呢?谢谢!
用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
$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;
?>
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯