3 unieke uitkomsten in een array plaatsen
Ik krijg af en toe nog steeds een dubbele uitkomst, kan iemand me vertellen wat ik niet goed doe?
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
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
<?php
$_SESSION['opdracht'] = array();
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;
}
// zet een max voor de hoogste uitkomst
if ($_GET['o'] == 1) { $max = 5; } elseif ($_GET['o'] == 2) { $max = 10; } else { $max = 15; }
do {
$loop = 1;
// maak de som
do {
// maak een random 1e getal
$firstnumber = rand(2, $max);
// random 2e getal
$secondnumber = rand(1, $max);
// trek het 2e van het 1e getal af
$uitkomst = $firstnumber - $secondnumber;
$loop++;
} while (($uitkomst <= 0 || in_array_r($uitkomst, $_SESSION['opdracht']) === true && $loop <= 100));
if ($loop == 100) { echo 'we hebben geen som kunnen maken'; exit; }
$som_toevoegen = (array("som" => $firstnumber. ' - '. $secondnumber , "uitkomst" => $uitkomst));
array_push ($_SESSION['opdracht'], $som_toevoegen);
} while (count($_SESSION['opdracht']) < 3);
?>
$_SESSION['opdracht'] = array();
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;
}
// zet een max voor de hoogste uitkomst
if ($_GET['o'] == 1) { $max = 5; } elseif ($_GET['o'] == 2) { $max = 10; } else { $max = 15; }
do {
$loop = 1;
// maak de som
do {
// maak een random 1e getal
$firstnumber = rand(2, $max);
// random 2e getal
$secondnumber = rand(1, $max);
// trek het 2e van het 1e getal af
$uitkomst = $firstnumber - $secondnumber;
$loop++;
} while (($uitkomst <= 0 || in_array_r($uitkomst, $_SESSION['opdracht']) === true && $loop <= 100));
if ($loop == 100) { echo 'we hebben geen som kunnen maken'; exit; }
$som_toevoegen = (array("som" => $firstnumber. ' - '. $secondnumber , "uitkomst" => $uitkomst));
array_push ($_SESSION['opdracht'], $som_toevoegen);
} while (count($_SESSION['opdracht']) < 3);
?>
Gewijzigd op 19/06/2020 11:24:26 door Sietsko Bos
$uitkomst = abs($firstnumber - $secondnumber);
Dan levert 5 - 7 namelijk 2 op. En zo te zien herhaal je je pogingen als je negatieve uitkomsten hebt.
Het alternatief is, om altijd de kleinste waarde van de grootste af te trekken, maar dat lijkt me meer werk dan abs().
Je kunt ook doen:
$secondnumber = rand(1, $max);
$firstnumber = rand($secondnumber + 1, $max);
Dat dwingt ook af dat je positieve uitkomsten krijgt.
-- qua probleem:
stel 10 en 4 zijn je getallen: dan is het verschil 6
je zoekt of
in_array_r($uitkomst, $_SESSION['opdracht'])
dus of 6 in $_SESSION['opdracht'] zit.
Maar op regel 38 duw je een array in $_SeSSION['opdracht']
dus Nee: 6 zit niet in $_SESSION['opdracht']. Daar zitten alleen array's in
Gewijzigd op 19/06/2020 11:47:51 door Sietsko Bos
https://www.php.net/in_array staat wel een commentaar (nr 11, Camille) waarin iemand een voorbeeld geeft hoe dat zou moeten (je moet in een loop door alle array's in jouw array heen.
(ik zou zelf de uitkomsten even in een los hulparray opslaan om deze check of je die uitkomst al had eenvoudig te kunnen doen)
nee. op (ik zou zelf de uitkomsten even in een los hulparray opslaan om deze check of je die uitkomst al had eenvoudig te kunnen doen)
Was inderdaad even een goeie tip, ik sla de uitkomsten nu eerst op in een hulparray.
Als het doel is om 3 (of een ander willekeurig aantal) unieke uitkomsten te krijgen, zou het dan niet veel logischer zijn om hiermee te beginnen? En dan een som in de omgekeerde richting te construeren? Begin met je unieke getal, tel hier een random getal bij op (A) en vervolgens heb je een of andere uitkomst (B).
En dan heb je je rekensom? <B> - <A> = <unieke uitkomst>?
Immers:
<unieke uitkomst> + <A> = <B>
is equivalent aan:
<unieke uitkomst> = <B> - <A>
Begin bij het einde?
EDIT: gaat trouwens de while-conditie wel goed?
Je gebruikt daar X || Y && Z.
Dit is equivalent aan (X || Y) && Z.
Maar dit is iets compleet anders als X || (Y && Z).
Gebruik altijd expliciet haken om de bij elkaar horende delen - vooral als je || en && combineert - zodat het altijd evident is wat er bedoeld wordt, en er nooit ruimte voor andere interpretatie mogelijk is.
Maar goed, dat is mogelijk een "moot point" als je je strategie wijzigt.
Voorbeeld:
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
<?php
$results = array_rand(array_fill_keys(array_merge(range(-10, -1), range(1, 20)), true), 3);
shuffle($results);
foreach ($results as $result) {
$random = rand(10, 25);
$sum = $result + $random;
echo $sum.' - '.$random.' = '.$result.'<br>';
}
?>
$results = array_rand(array_fill_keys(array_merge(range(-10, -1), range(1, 20)), true), 3);
shuffle($results);
foreach ($results as $result) {
$random = rand(10, 25);
$sum = $result + $random;
echo $sum.' - '.$random.' = '.$result.'<br>';
}
?>
Nummers voor de range()s en dergelijke kun je zelf tweaken.
Gewijzigd op 20/06/2020 12:55:46 door Thomas van den Heuvel