Door
Mark Honsbeek
op 02-05-2012 11:55
gewijzigd op 02-05-2012 12:05
4.345 views
Hallo,
zit met een vraagje.
Ik wil graag dat er een willekeurig getal wordt gekozen bijvoorbeeld tussen de 1 en de 35. Maar dan wil ik daar 16 van uitsluiten. (Dat mag geen uitkomst zijn)
Dan moet er dus eigenlijk een willekeurig getal worden gekozen tussen de 1 en de 15, en tussen de 17 en de 35.
Die 16 is variabel, dus kan van alles zijn tussen de 1 en de 35. ;)
Ik wil dus zoiets als de titel al zegt: Kies een getal tussen de $min en de $max, behalve $al_in_gebruik.
Je kan ook met behulp van range een array creeeren met alle mogelijke waardes en uit die array een getal kiezen:
<?php
$min = 1; $max = 35; $magniet = 16;
$values = array_merge(range($min, $magniet-1)), range($magniet+1, $max));
$getal = $values[rand(0, count($values)-1)];
?>
Het ziet er iets complexer uit dan wat SanThe gaf (en je zou eigenlijk nog een check moeten doen op de waarde van $magniet, zodat het binnen de juiste waardes zit), maar het voordeel is dat je niet in een mogelijk lange loop komt te zitten waarin rand precies elke keer het getal selecteert dat niet mag.
Maar hoe meer getallen je wilt uitsluiten, hoe groter de kans wordt dat je in een lange loop terecht komt waarin je elke keer de verkeerde waarde selecteert. In dat geval zou ik je zeker aanraden om te kijken naar een oplossing waarbij je gegarandeert een goede waarde vindt bij de eerste poging (zie mijn eerdere oplossing).
Maar hoe meer getallen je wilt uitsluiten, hoe groter de kans wordt dat je in een lange loop terecht komt waarin je elke keer de verkeerde waarde selecteert
Even getest en de tijdsduur is compleet te verwaarlozen. Zelfs in dit scriptje:
<?php
$magniet = range(1, 34);
do
{
$getal = rand(1, 35);
} while(in_array($getal, $magniet));
echo $getal;
?>
Totdat je het vaak genoeg doet en je de jackpot raakt. Het is nu eenmaal simpele statistiek dat er een moment komt dat je alleen maar de verkeerde getallen kiest, keer op keer op keer. En met de wet van Murphy in de hand komt dat moment waarschijnlijk ook nog vrij snel....
Dat gezegd hebbende, de oplossing van Santhe is zonder meer de simpelste.
@Erwin: Ik ben het geheel met je eens. Mijn laatste scriptje is dan ook een beetje onzinnig. Maar met enkele getallen als uitzondering zal het allemaal wel meevallen.