webForumDet fria alternativet

Kombinationer

ASP

10 svar · 722 visningar · startad av asp

Medlem sedan aug. 2002733 inlägg
Frågan#1

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. =)

Medlem sedan feb. 20001 590 inlägg
#2

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?

Medlem sedan aug. 2002733 inlägg
#3

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.

Medlem sedan sep. 2006867 inlägg
#4

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.

Medlem sedan aug. 2002733 inlägg
#5

Ja, men då lär jag mig ju inget.

Medlem sedan feb. 20001 590 inlägg
#6

Sannorlikheten kan du mycket enkelt räkna ut direkt utan att loopa kombinationerna. Både enklare och effektivare.

Medlem sedan aug. 2002733 inlägg
#7

Jo, men nu var min fråga HUR jag loopar igenom kombinationerna. Inte hur stor sannolikhet det är.

Medlem sedan jan. 2001229 inlägg
#8

(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++)
{
        
}
Medlem sedan jan. 2001229 inlägg
#9

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.

Medlem sedan jan. 2001229 inlägg
#10

....frågan är ju varför man vill köra koden i den innersta loopen *många* gånger :p

Medlem sedan aug. 2002733 inlägg
#11

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
261 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
121 ms — deklarationer (db)
0 ms — hämta statistik (cache)
135 ms — hämta tråd, inlägg och bilagor (db)
123 ms — ändringar (db)