Permalänk
Medlem

Blanda virtuella kort

Hej!

Lite halvt en fråga, lite halvt en utmaning...

Att sortera finns det otaliga algoritmer till, men hur är det med det omvända, tag t.ex. att blanda en kortlek.

Att göra detta är enkelt, den mest naiva approachen måste väl ändå vara att för varje element i arrayen (eller lista eller vad ni nu vill) som skall blandas, slumpa ett tal mellan 1 och antal element i arrayen, tolka det som ett index i en ny array och kolla om där finns ett värde. Om inte, "flytta" element från listan som skall blandas till nya arrayen, om det redan finns slumpa nytt tal tills ledig plats hittas.

Problemet med den implementationen är att den är teoretiskt sett väldigt ineffektiv. I slutet kommer de flesta elementen vara insorterade så antalet lediga platser kommer bli få.

Är ni med? Så, har ni några smarta algoritmer/datastrukturer för att blanda en array, som är effektiva? Ni behöver inte använda en array och ni behöver inte ge kodexempel. Gör som ni vill bara man förstår vad ni menar...

Permalänk
Medlem

Det här kanske kan vara nåt att titta på?
http://moongroup.com/pipermail/shell.scripting/2003-July/0048...

Visa signatur

Brass knuckles and a 2x4

Permalänk
Medlem

Såhär borde funka:
1. ha korten i en lista L
2. slumpa tal mellan 1 o listan Ls längd
3. ta kortet med det indexex o flytta det till längst fram i listan M.
4. repetera 2-3 tills L är tom
5. M är nu slumpad.

Behöver 52(51?) slumpade tal. Iof slumpar den inte inplace, och dessutom använder den länkade listor lr liknande, så jag antar att man kan fundera ut ngt ännu bättre. Dock borde den fungera korrekt förutsatt att slumptalen är ordentliga och oberoende av varandra, eller?

Edit: På den här sidan: http://www.cigital.com/papers/download/developer_gambling.pdf
kan du läsa om hur man inte ska göra iaf.

Permalänk
Medlem

jonasc: raden "random.shuffle(self.deck)" gör väl jobbet, eller missförtår jag?

vb: mm, det är en tanke, men längden av en lista med längd n är vanligtvis linjär, kanske det går att optimera ännu mera? Visserligen minskar längden av listan hela tiden...

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Enzo
jonasc: raden "random.shuffle(self.deck)" gör väl jobbet, eller missförtår jag?

Jo, så förstår jag det också.

Visa signatur

Brass knuckles and a 2x4

Permalänk
Medlem

Metoden som vb beskriver brukar kallas Knuth Shuffle. Google ger några bra länkar bla:
http://c2.com/cgi/wiki?LinearShuffleSummary

Permalänk
Medlem

Den missade jag helt! Tackar!

När jag läser den på det viset förstår jag vb's förslag lite bättre och det är skillnad på att förutsätta något och utföra något. Fel av mig.

Tip top!