getaldelen in x ongelijke getallen.
Ik zoek en manier om een getal te delen in x aantal ongelijke getallen. De x is een vast gegeven getal.
Voorbeeld:
Ik heb een getal 100,
ik moet dit verdelen in 6 stukken. Deze stukken mogen niet gelijk zijn... dus met
$result = 100 / 6; heb ik niets aan.
Ik moet een resultaat krijgen dat er zo ongeveer uitziet.
$r1 = 14; // 14
$r2 = 33; // 19
$r3 = 48; // 15
$r4 = 66; // 18
$r5 = 86; // 20
$r6 = 100; // 14
Hoe krijg ik zoiets voor elkaar in php?
PS: Bovenstaand moet je zien als een taart die verdeeld moet worden in 6 ongelijke stukken. De stukken moeten ongelijk zijn maar mogen maar maximaal 25% van elkaar verschillen val elkaar.
Gewijzigd op 21/10/2017 13:05:30 door Paul van de Peut
Ziet er uit als 5 random_int(1,99) getallen en 100.
- SanThe - op 21/10/2017 12:46:34:
Ziet er uit als 5 random_int(1,99) getallen en 100.
Sorry SanThe, ik was vergeten toe te voegen dat de getallen moeten verschillen zoals met random_int maar ze mogen niet te ver verschillen. Ik heb mijn vraag even aangepast. Ik zat inderdaad wel in die richting van random_int te zoeken.
Paul van de Peut op 21/10/2017 12:18:21:
Voorbeeld:
Ik heb een getal 100,
ik moet dit verdelen in 6 stukken.
Ik moet een resultaat krijgen dat er zo ongeveer uitziet.
$r1 = 14; // 14
$r2 = 33; // 19
$r3 = 48; // 15
$r4 = 66; // 18
$r5 = 86; // 20
$r6 = 100; // 14
De stukken moeten ongelijk zijn maar mogen maar maximaal 25% van elkaar verschillen val elkaar.
Ik heb een getal 100,
ik moet dit verdelen in 6 stukken.
Ik moet een resultaat krijgen dat er zo ongeveer uitziet.
$r1 = 14; // 14
$r2 = 33; // 19
$r3 = 48; // 15
$r4 = 66; // 18
$r5 = 86; // 20
$r6 = 100; // 14
De stukken moeten ongelijk zijn maar mogen maar maximaal 25% van elkaar verschillen val elkaar.
Je voorbeeld klopt dan niet: Er staat 2x 14 in.
Verder: ten opzicht van wat geldt die 25%? 25% van 14 is wat anders dan 25% van 20. Overigens klopt je voorbeeld ook niet op dat gebied: 25% van 20 is 5: daarmee zou 14 niet mogelijk zijn. En uitgaande van 14 zou je hoogste getal 17,5 mogen zijn. Of geldt de afwijking van 25% ten opzichte van 100/6 = 16,67%?
Even doorgerekend.
Uitgaande van 1/6 van 100 is dat gemiddeld 16,67.
Een verschil van 25% hiervan levert op 12,5 en 20,8.
Uitgaande van gehele getallen wordt dat 13 en 20 (anders wijk je meer dan 25% af).
Je wilt daar 6 (gehele) getallen tussen, die samen 100 opleveren en die niet gelijk aan elkaar mogen zijn. Dan heb je volgens mij niet zo heel veel keuze....
Gewijzigd op 21/10/2017 13:35:24 door Obelix Idefix
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
$procent = 25;
do
{ $array = array(0);
for($i=1;$i<7;$i++)
{ do
{ $getal = random_int($array[$i-1]+1, 100);
} while(($getal - $array[$i-1]) >= $procent or ($i < 6 and $getal > 99));
$array[$i] = $getal;
}
} while($getal < 100);
for($i=1;$i<7;$i++)
{ echo $array[$i].' ('.($array[$i]-$array[$i-1]).')<br/>';
}
?>
$procent = 25;
do
{ $array = array(0);
for($i=1;$i<7;$i++)
{ do
{ $getal = random_int($array[$i-1]+1, 100);
} while(($getal - $array[$i-1]) >= $procent or ($i < 6 and $getal > 99));
$array[$i] = $getal;
}
} while($getal < 100);
for($i=1;$i<7;$i++)
{ echo $array[$i].' ('.($array[$i]-$array[$i-1]).')<br/>';
}
?>
Gewijzigd op 21/10/2017 15:09:58 door - SanThe -
Fatal error: Uncaught Error: Minimum value must be less than or equal to the maximum value in C:\inetpub\httpdocs\test.php:8 Stack trace: #0 C:\inetpub\httpdocs\test.php(8): random_int(100, 99) #1 {main} thrown in C:\inetpub\httpdocs\test.php on line 8
Toch heel erg bedankt. Hier kan ik verder mee.
Toevoeging op 21/10/2017 15:10:57:
Code nogmaals aangepast.
De error is nu verdwenen.
Bij $procent = 20; liggen de resultaten dichter bij elkaar.
Gewijzigd op 21/10/2017 15:32:50 door - SanThe -
Code:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
function getRandoms($max, $pieces, $marge=25){
$average = intval(round($max / $pieces));
$marge_byint = intval(round(($average / 100) * $marge));
$result = array();
for($i=0; $i<$pieces; $i++){
$min = ($average * ($i+1)) - $marge_byint;
$max = ($average * ($i+1)) + $marge_byint;
$result[] = random_int($min, $max);
}
return $result;
}
$afstanden = getRandoms(100, 6);
$laatste = 0;
foreach($afstanden as $i => $afstand){
echo ($i+1).'e post is op '.$afstand.'km. Dit is '.($afstand - $laatste).'km van de vorige post af. <br/>';
$laatste = $afstand;
}
?>
function getRandoms($max, $pieces, $marge=25){
$average = intval(round($max / $pieces));
$marge_byint = intval(round(($average / 100) * $marge));
$result = array();
for($i=0; $i<$pieces; $i++){
$min = ($average * ($i+1)) - $marge_byint;
$max = ($average * ($i+1)) + $marge_byint;
$result[] = random_int($min, $max);
}
return $result;
}
$afstanden = getRandoms(100, 6);
$laatste = 0;
foreach($afstanden as $i => $afstand){
echo ($i+1).'e post is op '.$afstand.'km. Dit is '.($afstand - $laatste).'km van de vorige post af. <br/>';
$laatste = $afstand;
}
?>
Gewijzigd op 21/10/2017 16:12:15 door Paul van de Peut