deelsom met rest
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)
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
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']);
}
?>
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']);
}
?>
- 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
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
Code (php)
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
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 />';
}
?>
// 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,
);
}
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)
1
2
3
4
5
6
7
8
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
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
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 :)