deelsom met rest

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Sietsko Bos

Sietsko Bos

15/05/2017 19:08:32
Quote Anchor link
Hoi,

ik wil graag random 3 deelsommen (staartdeling) met rest maken, maar regelmatig krijg ik niet meer dan 1 of 2.
mijn script is misschien wat omslachtig en is vast voor verbetering vatbaar.
Zou iemand kunnen helpen om mijn script goed te krijgen zodat ik 3 verschillende deelsommen krijg met een unieke uitkomst en rest?

Hier is het stuk script wat ik heb gemaakt:

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
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
<?
function in_array_r($needle, $haystack, $strict = false) {
    foreach ($haystack as $item) {
        if (($strict ? $item === $needle : $item == $needle) || (is_array($item) && in_array_r($needle, $item, $strict))) {
            return true;
        }
    }

    return false;
}


if (empty($_SESSION['opdracht'])) {
    
        $_SESSION['opdracht'] = array();
        $_SESSION['antwoorden'] = array();
        
        $loop =1;
        $aantal_sommen = 1;
        
        if ($_GET['o'] == 1) { $max = 50; } elseif ($_GET['o'] == 2) { $max = 100; } else { $max = 250; }
        
        while ($aantal_sommen <= 3 && $loop <= 500) {
    
            $uitkomst = 0;
            $loop2 = 1;
            $somgemaakt = 0;
            
            while (($somgemaakt == 0) && ($loop2 < 500)) {

                $random_getal1 = rand($max/2, $max);
                $random_getal2 = rand(2, $max/2);
                
                if ($random_getal2 > $random_getal1) {
                
                    $apart = $random_getal1;
                    $random_getal1 = $random_getal2;
                    $random_getal2 = $apart;
                }


                $uitkomst = floor($random_getal1 / $random_getal2);
                $restwaarde = $random_getal1 % $random_getal2;
                            
                if ($uitkomst != 0) {
                
                    if ($uitkomst != $restwaarde) {
            
                        if (in_array_r($uitkomst, $_SESSION['antwoorden']) == false ) {
                    
                            if (in_array_r($restwaarde, $_SESSION['antwoorden']) == false ) {
                
                                array_push($_SESSION['antwoorden'], $uitkomst);
                                array_push($_SESSION['antwoorden'], $restwaarde);
                                array_push($_SESSION['opdracht'], array("getal1" => $random_getal1, "getal2" => $random_getal2, "antwoord" => $uitkomst, "rest" => $restwaarde));
                            }

                            $aantal_sommen++;
                            $somgemaakt = 1;
                        }
                    }
                }

                $loop2++;
            }

            $loop++;
            
        }

        shuffle ($_SESSION['antwoorden']);
}

?>
 
PHP hulp

PHP hulp

20/04/2024 03:05:12
 
Thomas van den Heuvel

Thomas van den Heuvel

15/05/2017 21:50:47
Quote Anchor link
Splits dit op in deelproblemen:
- het genereren van een aantal staartdelingen, hiervoor kun je een simpele loop gebruiken
- het kiezen van een random getal en een "geschikte" deler, dit zou je in een functie kunnen doen
- het daadwerkelijk uitvoeren van de staartdeling, wederom een simpele functie
- het wegschrijven van de resultaten in een datastructuur (weet niet helemaal waarom dit in een sessie zou moeten)?

Het feit dat je soms maar een of twee resultaten hebt in plaats van drie kan afhangen van de gekozen random getallen want onder bepaalde omstandigheden worden de resultaten niet opgeslagen. Dit zou je eenvoudig kunnen controleren door ergens bij te houden welke random waarden er allemaal voorbij komen.

Bovenstaande code is nogal wollig. Zoals gezegd, splits dit eens op in zinnige deelproblemen.
Gewijzigd op 15/05/2017 22:52:44 door Thomas van den Heuvel
 
Sietsko Bos

Sietsko Bos

15/05/2017 21:57:33
Quote Anchor link
@Thomas van den Heuvel

Ik weet dat het niet netjes is, maar weet ook niet hoe het anders te doen.
Het probleem was dat de tellers ($aantal_sommen++; $somgemaakt = 1;) niet binnen de if stonden.
Het werkt nu wel, als iemand me kan laten zien hoe het beter kan dan graag :)

Sietsko
 
Thomas van den Heuvel

Thomas van den Heuvel

15/05/2017 23:41:36
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
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?php
// returns random numerator and denominator
function getRandomNumbers($max=250) {
    $numerator = rand(1, $max);
    $denominator = rand(2, $numerator/2);
    return array($numerator, $denominator);
}


// returns quotient and remainder
function divide($a, $b) {
    return array(floor($a/$b), $a % $b);
}


// loop + save data
$whatever = 3;
$data = array();
for ($i = 0; $i < $whatever; $i++) {
    list($numerator, $denominator) = getRandomNumbers();
    list($quotient, $remainder) = divide($numerator, $denominator);
    $data[] = array(
        'numerator'     => $numerator,
        'denominator'     => $denominator,
        'quotient'         => $quotient,
        'remainder'        => $remainder,
    );
}


// print
foreach ($data as $line) {
    echo $line['numerator'].' gedeeld door '.$line['denominator'].' is gelijk aan '.$line['quotient'].($line['remainder'] > 0 ? ' rest '.$line['remainder'] : '').'<br />';
    echo 'immers '.$line['quotient'].' x '.$line['denominator'].($line['remainder'] > 0 ? ' + '.$line['remainder'] : '').' = '.$line['numerator'].'<hr />';
}

?>

Levert bijvoorbeeld:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
18 gedeeld door 7 is gelijk aan 2 rest 4
immers 2 x 7 + 4 = 18
------------------------
12 gedeeld door 3 is gelijk aan 4
immers 4 x 3 = 12
------------------------
195 gedeeld door 79 is gelijk aan 2 rest 37
immers 2 x 79 + 37 = 195
Gewijzigd op 15/05/2017 23:45:24 door Thomas van den Heuvel
 
Sietsko Bos

Sietsko Bos

16/05/2017 07:37:52
Quote Anchor link
Bedankt Thomas dit ziet er inderdaad minder chaotisch uit haha.
Ik ga hier van de week mee aan het testen in mijn script maar dat zal vast goed komen.
Bedankt voor de moeite en het voorbeeld want hier leer je tenslotte ook weer nieuwe dingen mee :)
 



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.