/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
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/

Søg
Reklame
Statistik
Spørgsmål : 177552
Tips : 31968
Nyheder : 719565
Indlæg : 6408847
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste