3 unieke uitkomsten in een array plaatsen

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Sietsko Bos

Sietsko Bos

19/06/2020 11:22:09
Quote Anchor link
Ik heb een stukje php script die 3 unieke uitkomsten moet aanmaken van een eraf som.

Ik krijg af en toe nog steeds een dubbele uitkomst, kan iemand me vertellen wat ik niet goed doe?

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
<?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);
?>
Gewijzigd op 19/06/2020 11:24:26 door Sietsko Bos
 
PHP hulp

PHP hulp

25/04/2024 10:49:23
 
Ivo P

Ivo P

19/06/2020 11:37:01
Quote Anchor link
ik zou om te beginnen de regel 29 voorzien van abs()

$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
 
Sietsko Bos

Sietsko Bos

19/06/2020 11:46:52
Quote Anchor link
Maar het is toch zo dat je met in_array_r() de functie aanroept die kan zoeken in een multidimensionale array?
Gewijzigd op 19/06/2020 11:47:51 door Sietsko Bos
 
Ivo P

Ivo P

19/06/2020 12:19:50
Quote Anchor link
nee. op 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)
 
Sietsko Bos

Sietsko Bos

19/06/2020 12:49:30
Quote Anchor link
Was inderdaad even een goeie tip, ik sla de uitkomsten nu eerst op in een hulparray.
 
Thomas van den Heuvel

Thomas van den Heuvel

19/06/2020 16:54:46
Quote Anchor link
Is dit niet allemaal veel te ingewikkeld?

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)
PHP script in nieuw venster Selecteer het PHP script
1
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>';
}

?>

Nummers voor de range()s en dergelijke kun je zelf tweaken.
Gewijzigd op 20/06/2020 12:55:46 door Thomas van den Heuvel
 



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.