Hjälp med testing av alla olika alternativ

Trädvy Permalänk
Medlem
Registrerad
Maj 2019

Hjälp med testing av alla olika alternativ

Hej!
Jag har ett problem hur jag ska tänka angående hur man testar av alla olika alternativ.

Tex stryktipset har tre olika alternativ gånger tretton men hur skriver jag en kod som testar av alla alternativ som i detta fallet är 1,594.323?

Trädvy Permalänk
Medlem
Registrerad
Dec 2015

Naivt: 13 loopar inuti varandra, där varje loop itererar över 1, X och 2. Längst in görs testet.

Mindre naivt: Med rekursion. Du anropar en funktion som innehåller en loop över 1,X och 2 som anropar sig själv inuti loopen. Vid varje anrop ökas en parameter som håller reda på djupet av anropet, när önskat djup (13) nås görs testet. Dessutom behöver du hålla reda på tillståndet från de tidigare anropen så att du har något att testa. Klassiska exempel på övningar med rekursion är att räkna ut x! (x-fakultet) eller Fibonacchi-talföljden, det finns garanterat massor av exempel på nätet. Gör inget dumt som får minnesanvändningen eller stackdjupet att växa för mycket.

Trädvy Permalänk
Medlem
Registrerad
Maj 2019

kan du ge ett exempel med kod?

Trädvy Permalänk
Medlem
Plats
Småland, långt ute i mörka skogen.
Registrerad
Maj 2018

Vill du bara ha ut alla alternativ rakt ut kan det vara bra att skapa en enkel "generator". Denna generator översätter mellan n och permutation n genom att på något sätt räkna ut rätt permutation. Det funkar fint om antalet permutationer är litet, som exempelvis i stryktips.

Här är ett exempel:

(Inte skrivet för prestanda eller kodstorlek utan för tydlighet, men skriver ändå ut alla rader på några sekunder.)

#include <iostream> #include <string> std::string generate_permutation(int n) { std::string permutation = ""; while(permutation.length() < 13) { // Next in permutation int modulo = n % 3; n = n / 3; if (modulo == 0) permutation.push_back('1'); else if (modulo == 1) permutation.push_back('X'); else // if (modulo == 2) permutation.push_back('2'); } return permutation; } int main() { int n = 0; std::string last = "2222222222222"; std::string current; do { current = generate_permutation (n); // do something with current permutation { std::cout << n << " == " << current << "\n"; } n++; } while (current != last); return 0; }

0 == 1111111111111 1 == X111111111111 2 == 2111111111111 3 == 1X11111111111 ... 1594319 == 2X22222222222 1594320 == 1222222222222 1594321 == X222222222222 1594322 == 2222222222222

Lade till utmatning

Linux och Android

Trädvy Permalänk
Medlem
Registrerad
Nov 2018

Jag förstår inte riktigt frågan, vad är det du vill göra? Vad menar du med att göra ett test? Vill du skapa en abstraktion/datastruktur som representerar en 1, x, 2 och göra 13 såna som i stryktipset? Vad menar du med siffran 1,594.323?

Du kan ju praktiskt taget slumpa fram en sträng bara innehållandes 1, x eller 2 så har du en sån. Därför får du gärna förtydliga vad du är ute efter.

Trädvy Permalänk
Medlem
Plats
Småland, långt ute i mörka skogen.
Registrerad
Maj 2018

@Ståupptuppen: 1 594 323 är antalet möjliga unika rader i ett 13 raders stryktips med 1X2.

Det verkar som att OP vill generera alla dessa rader på något smidigt sätt för någon form av test. Kan vara optimering, simulering eller liknande. Kanske för att testa hur effektiva olika reducerade stryktipssystem kan vara? Eller för att skapa sådana reducerade system. Eller för att generera och lagra många polynom effektivt. Eller något annat intressant.

Jag höll på med reducerade spelsystem för stryktips på en Amstrad PCW CP/M dator, med en Pascal-kompilator, en gång för länge, länge sedan. Det var så jag inte blev stenrik.

https://www.google.com/search?q=reducerat+stryktipssystem

Linux och Android

Trädvy Permalänk
Medlem
Registrerad
Maj 2019

Hej! vill bara säga att jag är så gott som nollad när det gäller programmering men tänkte att det borde gå mer rätt enkla medel att klara av !

Talet: 1,594.323 är så många möjliga rader det finns på stryktipset.

Jag vill få ut alla möjliga rader som Adoby visade ovanför. Sen vill jag byta ut 1,x,2 för varje match som spelas med ett värde som är ett procenttal (0,01-0,99) som jag sedan ska ta han dom.

Trädvy Permalänk
Moderator
Registrerad
Aug 2007
Skrivet av oljan123:

Hej! vill bara säga att jag är så gott som nollad när det gäller programmering men tänkte att det borde gå mer rätt enkla medel att klara av !

Talet: 1,594.323 är så många möjliga rader det finns på stryktipset.

Jag vill få ut alla möjliga rader som Adoby visade ovanför. Sen vill jag byta ut 1,x,2 för varje match som spelas med ett värde som är ett procenttal (0,01-0,99) som jag sedan ska ta han dom.

Det känns som att detta snarare är en 13 x 3 array för att spara procenttalen i.

Du behöver fundera över exakt vad du ska göra och hur man bäst representerar det. Att kötta igenom 1,5M möjliga kombinationer kommer inte att bli effektivt.

Använd gilla för att markera nyttiga inlägg!

Trädvy Permalänk
Medlem
Plats
Småland, långt ute i mörka skogen.
Registrerad
Maj 2018

Det låter mycket märkligt. Jag misstänker att du behöver fundera ett varv till och/eller formulera om vad det är du vill.

Om du förklarar VARFÖR du gör detta kan det bli lättare. Är detta en Monte-Carlo simulation? Alltså typ att du skall pröva någon form av spelsystem mot alla stryktips rader? Är procentsiffrorna oddsen?

https://sv.wikipedia.org/wiki/Monte_Carlo-metod

Kanske för varje rad kombinera oddsen för att få fram totala oddset för raden, och välja ut rader med bäst/sämst odds för att eliminera eller använda?

Om det tar några minuter att köra igenom 1,5 miljoner rader så är det väl inte hela världen. Så länge körtiden är högst några dagar borde det vara OK. Då hinner man både bearbeta veckans spel och lämna in innan det är för sent...

Linux och Android

Trädvy Permalänk
Moderator
Registrerad
Jul 2017

Nu ska jag berätta om något helt annat än stryktipsrader, nämligen det ternära talsystemet. Jag lovar att det är relevant!

Du känner säkert redan till det decimala talsystemet (med siffror från 0-9), det binära talsystemet (med siffrorna 0 och 1), och kanske det hexadecimala talsystemet (med 16 siffror, 0123456789ABCDEF) och det oktala talsystemet (med siffror från 0-7).

Det ternära talsystemet har tre siffror, 0, 1 och 2. Varför inte tre liksom? Alltså, t.ex. är talet 1203 = 1*32 + 2*31 + 0*30 = 1*9 + 2*3 + 0*1 = 9 + 6 + 1 = 16.

Okej, nu ska vi prata lite om stryktipsrader igen. Det finns 313 = 1 594 323 möjliga stryktipsrader. Jag börjar skriva alla raderna, och jag börjar med alla X, sen fortsätter jag med alla X och en 1:a på sista matchen, etc. Så här. Samtidigt så numrerar jag raderna från 0 - 1 594 322 (dataloger gillar att börja räkna på 0).

Och bara för att så numrerar jag alla raderna inte bara med det decimala talsystemet, utan med det ternära talsystemet som jag berättade om innan. (Jag fyller också på med nollor i början på numren för skojs skull. Bara för att. Varför inte?)

Då får vi det här:

Radnummer (decimalt)

Radnummer (ternärt)

Rad

0

0000000000000

X X X X X X X X X X X X X

1

0000000000001

X X X X X X X X X X X X 1

2

0000000000002

X X X X X X X X X X X X 2

3

0000000000010

X X X X X X X X X X X 1 X

4

0000000000011

X X X X X X X X X X X 1 1

5

0000000000012

X X X X X X X X X X X 1 2

6

0000000000020

X X X X X X X X X X X 2 X

7

0000000000021

X X X X X X X X X X X 2 1

Men titta efter lite, jämför alltså kolumnen för radnummret i ternärt formad med själva stryktipsraden! Som magi så kommer stryktipsraden alltså fram i själva siffrorna, och det enda du behöver är alltså numret på stryktipsraden! Du behöver alltså aldrig ens lagra dina 1,5 miljoner stryktipsrader i minnet, det räcker att du vet vilket nummer det är på raden du behandlar så kan du magiskt räkna fram vad raden är. Smart va?

Dags för lite källkod. Vi tar det i Python som ett exempel:

def tipsrad_fran_nummer(nummer): tipsrad = '' for _ in range(13): # 13 gånger så kör vi: tipsnr = nummer % 3 # Dela med 3, ta fram resten, det blir vårt tips. (0 är X, 1 är 1, 2 är 2) tips = 'X12'[tipsnr] # Gör om numret till ett tecken X, 1 eller 2 tipsrad = tips + tipsrad # Lägg till tipset i början av tipsraden nummer /= 3 # Dela med 3 och kasta bort resten, så att vi kan jobba med nästa tips! return tipsrad tipsrad = tipsrad_fran_nummer(16) print(tipsrad)

(Går även att fippla med via CodePad: http://codepad.org/7c2PkEmR)

Jag kunde också ha använt färdiga funktioner för att konvertera ett tal till bas 3 och byta nollorna mot X, men det här kändes mer pedagogiskt.

Koden ovan ger dig alltså en stryktipsrad givet ett tal från 0 till 1594322. (Koden borde egentligen säga ifrån om man ger den ett tal utanför denna range, men jag valde att göra koden så enkel som möjligt.)

En bild säger mer än tusen ord. Så här gör du för att lägga upp bilder till ditt foruminlägg.

Synpunkter på moderering eller andra frågor om siten? Välkommen att kontakta oss via Sweclockers kontaktformulär eller i feedback-forumet.

Trädvy Permalänk
Medlem
Plats
~/Karlstad
Registrerad
Dec 2005
Skrivet av pv2b:

Nu ska jag berätta om något helt annat än stryktipsrader, nämligen det ternära talsystemet. Jag lovar att det är relevant!

Du känner säkert redan till det decimala talsystemet (med siffror från 0-9), det binära talsystemet (med siffrorna 0 och 1), och kanske det hexadecimala talsystemet (med 16 siffror, 0123456789ABCDEF) och det oktala talsystemet (med siffror från 0-7).

Det ternära talsystemet har tre siffror, 0, 1 och 2. Varför inte tre liksom? Alltså, t.ex. är talet 1203 = 1*32 + 2*31 + 0*30 = 1*9 + 2*3 + 0*1 = 9 + 6 + 1 = 16.

Okej, nu ska vi prata lite om stryktipsrader igen. Det finns 313 = 1 594 323 möjliga stryktipsrader. Jag börjar skriva alla raderna, och jag börjar med alla X, sen fortsätter jag med alla X och en 1:a på sista matchen, etc. Så här. Samtidigt så numrerar jag raderna från 0 - 1 594 322 (dataloger gillar att börja räkna på 0).

Och bara för att så numrerar jag alla raderna inte bara med det decimala talsystemet, utan med det ternära talsystemet som jag berättade om innan. (Jag fyller också på med nollor i början på numren för skojs skull. Bara för att. Varför inte?)

Då får vi det här:

Radnummer (decimalt)

Radnummer (ternärt)

Rad

0

0000000000000

X X X X X X X X X X X X X

1

0000000000001

X X X X X X X X X X X X 1

2

0000000000002

X X X X X X X X X X X X 2

3

0000000000010

X X X X X X X X X X X 1 X

4

0000000000011

X X X X X X X X X X X 1 1

5

0000000000012

X X X X X X X X X X X 1 2

6

0000000000020

X X X X X X X X X X X 2 X

7

0000000000021

X X X X X X X X X X X 2 1

Men titta efter lite, jämför alltså kolumnen för radnummret i ternärt formad med själva stryktipsraden! Som magi så kommer stryktipsraden alltså fram i själva siffrorna, och det enda du behöver är alltså numret på stryktipsraden! Du behöver alltså aldrig ens lagra dina 1,5 miljoner stryktipsrader i minnet, det räcker att du vet vilket nummer det är på raden du behandlar så kan du magiskt räkna fram vad raden är. Smart va?

Dags för lite källkod. Vi tar det i Python som ett exempel:

def tipsrad_fran_nummer(nummer): tipsrad = '' for _ in range(13): # 13 gånger så kör vi: tipsnr = nummer % 3 # Dela med 3, ta fram resten, det blir vårt tips. (0 är X, 1 är 1, 2 är 2) tips = 'X12'[tipsnr] # Gör om numret till ett tecken X, 1 eller 2 tipsrad = tips + tipsrad # Lägg till tipset i början av tipsraden nummer /= 3 # Dela med 3 och kasta bort resten, så att vi kan jobba med nästa tips! return tipsrad tipsrad = tipsrad_fran_nummer(16) print(tipsrad)

(Går även att fippla med via CodePad: http://codepad.org/7c2PkEmR)

Jag kunde också ha använt färdiga funktioner för att konvertera ett tal till bas 3 och byta nollorna mot X, men det här kändes mer pedagogiskt.

Koden ovan ger dig alltså en stryktipsrad givet ett tal från 0 till 1594322. (Koden borde egentligen säga ifrån om man ger den ett tal utanför denna range, men jag valde att göra koden så enkel som möjligt.)

Snygg lösning och förmodligen den bästa. Dock fungerar inte koden du skapat då det smugit sig in ett litet fel^^

nummer /= 3

fungerar inte då du får en rest med decimaler. I ditt fall 16/3=5.33333 vilket i nästa iteration ger en rest på 2.333 vilket såklart inte är ett giltigt index när du ska hämta från tips = 'X12'[tipsnr].
Bör lösas med att köra istället:

nummer //= 3

Den ändringen genererar då:

Rad 0 XXXXXXXXXXXXX Rad 1 XXXXXXXXXXXX1 Rad 2 XXXXXXXXXXXX2 Rad 3 XXXXXXXXXXX1X Rad 4 XXXXXXXXXXX11 Rad 5 XXXXXXXXXXX12 Rad 6 XXXXXXXXXXX2X Rad 7 XXXXXXXXXXX21 Rad 8 XXXXXXXXXXX22 Rad 9 XXXXXXXXXX1XX Rad 10 XXXXXXXXXX1X1 Rad 11 XXXXXXXXXX1X2 Rad 12 XXXXXXXXXX11X Rad 13 XXXXXXXXXX111 Rad 14 XXXXXXXXXX112 Rad 15 XXXXXXXXXX12X Rad 16 XXXXXXXXXX121 Rad 17 XXXXXXXXXX122 Rad 18 XXXXXXXXXX2XX Rad 19 XXXXXXXXXX2X1 Rad 20 XXXXXXXXXX2X2 Rad 21 XXXXXXXXXX21X Rad 22 XXXXXXXXXX211 Rad 23 XXXXXXXXXX212 Rad 24 XXXXXXXXXX22X Rad 25 XXXXXXXXXX221 Rad 26 XXXXXXXXXX222 Rad 27 XXXXXXXXX1XXX Rad 28 XXXXXXXXX1XX1 Rad 29 XXXXXXXXX1XX2

Dold text

Modifierade koden lite så du kan få ut aktuella odds också vad du nu ska göra med det, går ju att ta vidare:

"""Fyll i dina odds Ordning är [1,X,2] för varje rad där översta raden är Värdet längst till vänster i din tipprad Typ 1 i följande rad: 1XXX1XX2XX1X2 """ odds = ( [0.1, 0.05, 0.02], [0.2, 0.15, 0.12], [0.3, 0.25, 0.22], [0.4, 0.35, 0.32], [0.5, 0.45, 0.42], [0.6, 0.55, 0.52], [0.7, 0.65, 0.62], [0.8, 0.75, 0.72], [0.9, 0.85, 0.82], [1.0, 0.95, 0.92], [0.43, 0.25, 0.17], [0.65, 0.55, 0.93], [0.23, 0.75, 0.81]) def tipsrad_fran_nummer(nummer): tipsrad = '' for _ in range(13): # 13 gånger så kör vi: tipsnr = nummer % 3 # Dela med 3, ta fram resten, det blir vårt tips. (0 är X, 1 är 1, 2 är 2) tips = 'X12'[tipsnr] # Gör om numret till ett tecken X, 1 eller 2 tipsrad = tips + tipsrad # Lägg till tipset i början av tipsraden nummer //= 3 # Dela med 3 och kasta bort resten, så att vi kan jobba med nästa tips! return tipsrad def ersatt_tips_med_odds(tipsrad): odds_lista = [] get_index_string = '1X2' for idx, c in enumerate(tipsrad): odds_lista.append(odds[idx][get_index_string.find(c)]) return odds_lista for i in range(20): tips_rad = tipsrad_fran_nummer(i) odds_rad = ersatt_tips_med_odds(tips_rad) print("Raden", tips_rad, "har följande odds:") print(odds_rad)

Output blir:

Raden XXXXXXXXXXXXX har följande odds: [0.05, 0.15, 0.25, 0.35, 0.45, 0.55, 0.65, 0.75, 0.85, 0.95, 0.25, 0.55, 0.75] Raden XXXXXXXXXXXX1 har följande odds: [0.05, 0.15, 0.25, 0.35, 0.45, 0.55, 0.65, 0.75, 0.85, 0.95, 0.25, 0.55, 0.23] Raden XXXXXXXXXXXX2 har följande odds: [0.05, 0.15, 0.25, 0.35, 0.45, 0.55, 0.65, 0.75, 0.85, 0.95, 0.25, 0.55, 0.81] Raden XXXXXXXXXXX1X har följande odds: [0.05, 0.15, 0.25, 0.35, 0.45, 0.55, 0.65, 0.75, 0.85, 0.95, 0.25, 0.65, 0.75] Raden XXXXXXXXXXX11 har följande odds: [0.05, 0.15, 0.25, 0.35, 0.45, 0.55, 0.65, 0.75, 0.85, 0.95, 0.25, 0.65, 0.23] Raden XXXXXXXXXXX12 har följande odds: [0.05, 0.15, 0.25, 0.35, 0.45, 0.55, 0.65, 0.75, 0.85, 0.95, 0.25, 0.65, 0.81] Raden XXXXXXXXXXX2X har följande odds: [0.05, 0.15, 0.25, 0.35, 0.45, 0.55, 0.65, 0.75, 0.85, 0.95, 0.25, 0.93, 0.75] Raden XXXXXXXXXXX21 har följande odds: [0.05, 0.15, 0.25, 0.35, 0.45, 0.55, 0.65, 0.75, 0.85, 0.95, 0.25, 0.93, 0.23] Raden XXXXXXXXXXX22 har följande odds: [0.05, 0.15, 0.25, 0.35, 0.45, 0.55, 0.65, 0.75, 0.85, 0.95, 0.25, 0.93, 0.81] Raden XXXXXXXXXX1XX har följande odds: [0.05, 0.15, 0.25, 0.35, 0.45, 0.55, 0.65, 0.75, 0.85, 0.95, 0.43, 0.55, 0.75] Raden XXXXXXXXXX1X1 har följande odds: [0.05, 0.15, 0.25, 0.35, 0.45, 0.55, 0.65, 0.75, 0.85, 0.95, 0.43, 0.55, 0.23] Raden XXXXXXXXXX1X2 har följande odds: [0.05, 0.15, 0.25, 0.35, 0.45, 0.55, 0.65, 0.75, 0.85, 0.95, 0.43, 0.55, 0.81] Raden XXXXXXXXXX11X har följande odds: [0.05, 0.15, 0.25, 0.35, 0.45, 0.55, 0.65, 0.75, 0.85, 0.95, 0.43, 0.65, 0.75] Raden XXXXXXXXXX111 har följande odds: [0.05, 0.15, 0.25, 0.35, 0.45, 0.55, 0.65, 0.75, 0.85, 0.95, 0.43, 0.65, 0.23] Raden XXXXXXXXXX112 har följande odds: [0.05, 0.15, 0.25, 0.35, 0.45, 0.55, 0.65, 0.75, 0.85, 0.95, 0.43, 0.65, 0.81] Raden XXXXXXXXXX12X har följande odds: [0.05, 0.15, 0.25, 0.35, 0.45, 0.55, 0.65, 0.75, 0.85, 0.95, 0.43, 0.93, 0.75] Raden XXXXXXXXXX121 har följande odds: [0.05, 0.15, 0.25, 0.35, 0.45, 0.55, 0.65, 0.75, 0.85, 0.95, 0.43, 0.93, 0.23] Raden XXXXXXXXXX122 har följande odds: [0.05, 0.15, 0.25, 0.35, 0.45, 0.55, 0.65, 0.75, 0.85, 0.95, 0.43, 0.93, 0.81] Raden XXXXXXXXXX2XX har följande odds: [0.05, 0.15, 0.25, 0.35, 0.45, 0.55, 0.65, 0.75, 0.85, 0.95, 0.17, 0.55, 0.75] Raden XXXXXXXXXX2X1 har följande odds: [0.05, 0.15, 0.25, 0.35, 0.45, 0.55, 0.65, 0.75, 0.85, 0.95, 0.17, 0.55, 0.23]

Dold text

Ha kul att loopa igenom 3^13 gånger

Bara gammalt skräp...

Trädvy Permalänk
Moderator
Registrerad
Aug 2007

Problemet är att de där långa listorna med rader gör ju ingen glad. Man måste göra någon ytterligare process på det hela. Så vad är det som ska åstadkommas?

Vill man tex hitta raden eller raderna med störst chans behöver man inte skapa upp alla raderna.
Man kan göra mycket smarta grejer med bara en 13x3 array och lite smarta algoritmer.

Använd gilla för att markera nyttiga inlägg!