aspMedlem sedan aug. 2002733 inlägg Hej.
Jag vill loopa igenom alla kombinationer som är möjliga. Vilka sätt kan man plocka fram 5 element ur en lista av 52 element där ordningen inte spelar någon roll. Dvs ABCDE är samma sak som EDCBA. Dessutom får inte elementen upprepas. Dvs AABCD är inte tillåtet eftersom det förekommer två A.
Ett sätt jag testade var att köra 5 nästlade for-loopar. Där jag i varje loop körde igenom från 1 till 52. Dock gjordes en kontroll så inte det upprepas samma tecken. Men nu får jag ju inte fram endast en av varje kombination - utan vissa kombinationer upprepas. Man kan ju göra en if-sats som kontrollerar så inte kombinationen redan finns - men finns det något smidigare sätt?
Att plocka fram 5 element ur 52 där ordningen inte spelar någon roll, finns det ca 3,2 element om jag minns rätt. Då gäller det att effektivisera koden. =)
ToonsterMedlem sedan feb. 20001 590 inlägg Varför måste du loopa igenom allt? Kan du inte slumpa dessa 5? Misstänker att det är en kortlek du ska manipulera. Eller har jag missuppfattat?
aspMedlem sedan aug. 2002733 inlägg Därför jag vill få med exakt alla kombinationer. Då får jag med exakt procentsats när jag skall kolla sannolikheten för t.ex. kåk. Det är en kortlek ja.
headbugMedlem sedan sep. 2006867 inlägg Fast det du gör är ju att beräkna välkända sannolikheter, det vore väl effektivare att slå upp dom på nätet eller i vilken sannolikhetslärobok som helst och skapa konstanter med värdena.
aspMedlem sedan aug. 2002733 inlägg Ja, men då lär jag mig ju inget.
ToonsterMedlem sedan feb. 20001 590 inlägg Sannorlikheten kan du mycket enkelt räkna ut direkt utan att loopa kombinationerna. Både enklare och effektivare.
aspMedlem sedan aug. 2002733 inlägg Jo, men nu var min fråga HUR jag loopar igenom kombinationerna. Inte hur stor sannolikhet det är.
(Java, men principen är samma.. Orkar inte riktigt tänka ut ifall detta förhindrar dubletter, men det kan ju du ta reda på.)
int nrCards = 52;
for(int c1 = 0; c1<nrCards-4; c1++)
for(int c2 = c1+1; c1<nrCards-3; c2++)
for(int c3 = c2+1; c1<nrCards-2; c3++)
for(int c4 = c3+1; c1<nrCards-1; c4++)
for(int c5 = c4+1; c1<nrCards; c5++)
{
}
När jag funderat på det ett tag så kommer dessa kort alltid att vara i ordning (c1 alltid mindre än c2, c2 alltid mindre än c3 osv.) Du kan alltså inte få dubletter.
....frågan är ju varför man vill köra koden i den innersta loopen *många* gånger :p
aspMedlem sedan aug. 2002733 inlägg Löste det med följande kod.
For a = 0 To UBound(kort)
For b = a+1 To UBound(kort)
For c = b+1 To UBound(kort)
For d = c+1 To UBound(kort)
For e = d+1 To UBound(kort)
'...
Next
Next
Next
Next
Next