|
| Tænk på et kort Fra : Arne Feldborg |
Dato : 10-09-06 23:11 |
|
Hejsa...
Dette er så banalt et problem, at der nødvendigvis må være nogen der er
stødt på det før - og måske også har fundet en smart løsning.
Hvis man skal udtrække feks. 5 tilfældige nøgler (i det følgende kaldet
kort) af et array med feks. ialt 52 kort, så har man jo den aldeles
glimragende funktion array_rand () til rådighed. Så vidt så godt.
Men hvad nu hvis man vil udtrække yderligere 5 kort, hvor de først
udtrukne naturligvis ikke må indgå.?
Man kan selvfølgelig starte med at udtrække 10 kort, og kun vise de 5 i
første omgang. Men dels er det jo en løsning baseret på
symptombehandling. Og dels vil det jo alligevel gå galt, hvis det i en
given situation viser sig, at man skal udtrække yderligere kort.
Alternativet er, efter hver udtrækning, at reducere array'et til det nye
antal nøgler, hvilket også indebærer at de tilbageværende nøgler bliver
opsorteret og omnummereret inde i array'et.
Der må da findes en mere elegant måde.?
--
mvh, A:\Feldborg
Slægtsforskning og lokalhistorie i midt- vestjylland
http://hammerum-herred.dk/
| |
Geert Lund (10-09-2006)
| Kommentar Fra : Geert Lund |
Dato : 10-09-06 23:27 |
|
Arne Feldborg wrote:
> Der må da findes en mere elegant måde.?
Det er vel nemmere i dette tilfælde blot at checke om det udtrukne
nummer allerede fremgår af din udtrukne liste - for det skal du jo gøre
om alle omstændigheder da det samme nummer jo ikke må udtrækkes 2 gange
sådan som jeg læser det - uanset om du trækker 5 eller 10 kort?
I det tilfælde nummeret allerede er udtrukket - skal du så bare
itterrere igen...
--
Med venlig hilsen
Geert Lund,
www.GLD.dk
| |
Michael Zedeler (10-09-2006)
| Kommentar Fra : Michael Zedeler |
Dato : 10-09-06 23:24 |
|
Arne Feldborg wrote:
> Dette er så banalt et problem, at der nødvendigvis må være nogen der er
> stødt på det før - og måske også har fundet en smart løsning.
>
> Hvis man skal udtrække feks. 5 tilfældige nøgler (i det følgende kaldet
> kort) af et array med feks. ialt 52 kort, så har man jo den aldeles
> glimragende funktion array_rand () til rådighed. Så vidt så godt.
>
> Men hvad nu hvis man vil udtrække yderligere 5 kort, hvor de først
> udtrukne naturligvis ikke må indgå.?
>
> [...]
> Der må da findes en mere elegant måde.?
Det mest oplagte er, at tænke på kortene som en blandet bunke, hvor man
kun kan trække ét kort ad gangen. Smid alle dine kort (tilfældigt) i et
array med 52 pladser og træk dem et ad gangen fra plads et op til 52.
Hvis du skal bruge fem, så træk 5
Det kræver et array med 52 pladser og en tæller. Der findes muligvis en
funktion som behandler et array som en stak, så man kan slippe for tælleren.
Mvh. Michael.
--
Which is more dangerous? TV guided missiles or TV guided families?
I am less likely to answer usenet postings by anonymous authors.
Visit my home page at http://michael.zedeler.dk/
| |
Martin (11-09-2006)
| Kommentar Fra : Martin |
Dato : 11-09-06 05:25 |
|
Arne Feldborg wrote:
> Hejsa...
>
> Dette er så banalt et problem, at der nødvendigvis må være nogen der er
> stødt på det før - og måske også har fundet en smart løsning.
>
> Hvis man skal udtrække feks. 5 tilfældige nøgler (i det følgende kaldet
> kort) af et array med feks. ialt 52 kort, så har man jo den aldeles
> glimragende funktion array_rand () til rådighed. Så vidt så godt.
>
> Men hvad nu hvis man vil udtrække yderligere 5 kort, hvor de først
> udtrukne naturligvis ikke må indgå.?
>
> Man kan selvfølgelig starte med at udtrække 10 kort, og kun vise de 5 i
> første omgang. Men dels er det jo en løsning baseret på
> symptombehandling. Og dels vil det jo alligevel gå galt, hvis det i en
> given situation viser sig, at man skal udtrække yderligere kort.
>
> Alternativet er, efter hver udtrækning, at reducere array'et til det nye
> antal nøgler, hvilket også indebærer at de tilbageværende nøgler bliver
> opsorteret og omnummereret inde i array'et.
>
> Der må da findes en mere elegant måde.?
>
<?php
$kort = array("spar es","spar 2".......);
shuffle($kort);
foreach($kort AS $card) {
echo $card."<br>";
}
?>
Så simpelt... :)
Bemærk dog at FØR PHP 4.2.0 der skal du lige i starten af scriptet indsætte.
srand((float)microtime() * 1000000);
| |
Martin (11-09-2006)
| Kommentar Fra : Martin |
Dato : 11-09-06 05:28 |
|
Martin wrote:
> <?php
>
> $kort = array("spar es","spar 2".......);
> shuffle($kort);
>
> foreach($kort AS $card) {
> echo $card."<br>";
> }
> ?>
Eller kun 5 kort
for($i=0;$i<5;$i++) {
echo $kort[$i];
}
for de næste 10 kort kan man så benytte
for($i=4;$i<15;$i++) {
echo $kort[$i];
}
| |
Thomas Lindgaard (11-09-2006)
| Kommentar Fra : Thomas Lindgaard |
Dato : 11-09-06 08:53 |
|
Martin wrote:
> Martin wrote:
>> <?php
>>
>> $kort = array("spar es","spar 2".......);
>> shuffle($kort);
>>
>> foreach($kort AS $card) {
>> echo $card."<br>";
>> }
>> ?>
Alternativt:
<?php
for ($i = 0; $i < 5; $i++)
{
print array_pop($kort);
}
?>
så er det nemlig let at trække flere kort:
<?php
for ($i = 0; $i < 5; $i++)
{
print array_pop($kort);
}
?>
:)
(så skal man bare lige sikre sig, at man ikke kommer til at trække mere
end 52 kort.
--
Mvh.
/Thomas Lindgaard
| |
Martin (11-09-2006)
| Kommentar Fra : Martin |
Dato : 11-09-06 12:09 |
|
Thomas Lindgaard wrote:
> Martin wrote:
>
>> Martin wrote:
>>
>>> <?php
>>>
>>> $kort = array("spar es","spar 2".......);
>>> shuffle($kort);
>>>
>>> foreach($kort AS $card) {
>>> echo $card."<br>";
>>> }
>>> ?>
>
>
> Alternativt:
>
> <?php
>
> for ($i = 0; $i < 5; $i++)
> {
> print array_pop($kort);
> }
>
> ?>
>
> så er det nemlig let at trække flere kort:
>
> <?php
>
> for ($i = 0; $i < 5; $i++)
> {
> print array_pop($kort);
> }
>
> ?>
Jep, men hvis man så liiige vil sige kort 1-7 igen - så er det meget
svært, for array_pop fjerner jo kortene fra arrayet, og tror der er
MEGET lille sandsynlighed for at man rammer præcis samme array med
shuffle 2 gange :)
| |
Michael Zedeler (11-09-2006)
| Kommentar Fra : Michael Zedeler |
Dato : 11-09-06 13:58 |
|
Martin wrote:
> Thomas Lindgaard wrote:
>
>> print array_pop($kort);
>> [...]
>
> Jep, men hvis man så liiige vil sige kort 1-7 igen - så er det meget
> svært, for array_pop fjerner jo kortene fra arrayet, og tror der er
> MEGET lille sandsynlighed for at man rammer præcis samme array med
> shuffle 2 gange :)
Til gengæld har man større risiko for fejlagtigt at komme til at trække
det samme kort to gange på grund af off by one-fejl eller lignende. Hvis
man bruger array_pop, burde det aldrig ske.
Mvh. Michael.
--
Which is more dangerous? TV guided missiles or TV guided families?
I am less likely to answer usenet postings by anonymous authors.
Visit my home page at http://michael.zedeler.dk/
| |
Arne Feldborg (11-09-2006)
| Kommentar Fra : Arne Feldborg |
Dato : 11-09-06 22:43 |
|
Arne Feldborg <feldborg@haunstrup.dk> skrev Mon, 11 Sep 2006 00:10:33
+0200
>Dette er så banalt et problem, at der nødvendigvis må være nogen der er
>stødt på det før - og måske også har fundet en smart løsning.
>
Mange tak for de gode svar. Jeg tænkte nok, at der simpelthen måtte være
en mere smart løsning, end det jeg var i gang med.
Jeg havde vist stirret mig helt blind på, at kortene skulle udtrækkes
tilfældigt - og det skal de jo netop ikke. De skal jo bare blandes og så
tages fra toppen af stakken, akurat som hvis man sad med dem i hånden.
Om man så skal tælle sig frem, eller om man skal bruge array_pop(),
afhænger nok af den givne situation. Metoden med array_pop() minder vel
egentlig mest om den situation, hvor man sidder med kortene i hånden.
Tak for hjælpen.
--
mvh, A:\Feldborg
Slægtsforskning og lokalhistorie i midt- vestjylland
http://hammerum-herred.dk/
| |
|
|