getaldelen in x ongelijke getallen.

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Paul van de Peut

Paul van de Peut

21/10/2017 12:18:21
Quote Anchor link
Hoi

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
 
PHP hulp

PHP hulp

30/11/2024 03:50:23
 
- SanThe -

- SanThe -

21/10/2017 12:46:34
Quote Anchor link
Ziet er uit als 5 random_int(1,99) getallen en 100.
 
Paul van de Peut

Paul van de Peut

21/10/2017 13:08:34
Quote Anchor link
- 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.
 
Obelix Idefix

Obelix Idefix

21/10/2017 13:28:42
Quote Anchor link
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.

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
 
- SanThe -

- SanThe -

21/10/2017 14:30:48
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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/>';
}

?>
Gewijzigd op 21/10/2017 15:09:58 door - SanThe -
 
Paul van de Peut

Paul van de Peut

21/10/2017 14:59:34
Quote Anchor link
Bedankt. Dit is wat ik zocht. Er zit wel een foutje in je code. Die krijg ik er nog wel uit bij het invoegen in mijn huidige script. Hij geeft regelmatig de volgende fout:

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.
 
- SanThe -

- SanThe -

21/10/2017 15:03:50
Quote Anchor link
Code iets aangepast.

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 -
 
Paul van de Peut

Paul van de Peut

21/10/2017 16:10:21
Quote Anchor link
Bedankt voor je hulp. Jouw code heeft geholpen tot het bedenken van een functie die in mijn situatie nog beter werkt. Dat getal 100 wat ik had gegeven hoef je niet precies op uit te komen. Zolang het maar binnen de marge valt. In mijn script gaat het om een te lopen afstand (100 km) waarin ik een aantal (bijv. 5) posten + finish moet plaatsen. Deze posten mogen niet precies hetzelfde zijn zodat deelnemers niet kunnen afsnijden zodra ze een van de afstanden weten. Ik heb nu de volgende functie geschreven die wat eenvoudiger is om te begrijpen. Geïnspireerd door jouw code. Bedankt.

Code:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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;
}

?>
Gewijzigd op 21/10/2017 16:12:15 door Paul van de Peut
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.