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...
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?
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...