Försöker göra en lottningsfunktion.
Har den här koden.
sub lotta(obj as object, e as eventargs)
dim lag(4)
lag(0) = "Tibro IK"
lag(1) ="Skövde IK"
lag(2) = "Mariestad Bois"
lag(3) ="Skara IK"
dim i as integer
Dim r As New Random()
dim match(15,2)
dim match1(15)
for i = 0 to 11
match(i,1)=lag(r.Next(0, 4))
match(i,2)=lag(r.Next(0, 4))
match1(i) = match(i,1)&"-"&match(i,2)
response.write(match1(i)&"<br />")
next
end sub
Nu lottas två lag mot varandra. Problemet är att match(i,1) kan bli samma som match(i,2).
Hur ska jag göra så att lagen inte kan möta sig själva
PatrikBMedlem sedan mars 20002 836 inlägg Ok, här är en som funkar
sub lotta()
dim lag(4)
lag(0) = "Tibro IK"
lag(1) ="Skövde IK"
lag(2) = "Mariestad Bois"
lag(3) ="Skara IK"
dim i as integer
Dim r As New Random()
dim match(15,2)
dim match1(15)
for i = 0 to 15
Dim intHome As Integer = -1
Dim intVisitor As Integer = -1
Dim bolEqual As Boolean = True
Do While bolEqual
intHome = r.Next(0,4)
intVisitor = r.Next(0,4)
If intHome <> intVisitor Then
bolEqual = False
End If
Loop
match(i,1)=lag(intHome)
match(i,2)=lag(intVisitor)
match1(i) = match(i,1)&"-"&match(i,2)
response.write(match1(i)&"<br />")
next i
end sub
Den funkar så att inget lag får spela mot sig själv. Men! med denna typ av slumpning så kan ett lag få spela 10 matcher, ett annat lag 1 match osv .... dvs, de kommer inte att få spela lika många ggr.
cya,
PatrikB
Nu har jag kommit lite längre. Nu kan lagen bara möta varandra en gång. Hur gör man för att räkna så att alla lag får spela samma antal matcher
jag har den här koden
sub lotta(obj as object, e as eventargs)
dim lag(6)
lag(0) = "Tibro IK"
lag(1) = "Skövde IK"
lag(2) = "Mariestad Bois"
lag(3) = "Skara IK"
lag(4) = "Leksands IF"
lag(5) = "Hammarby IF"
dim i as integer
Dim r As New Random()
dim antal_matcher as integer = 15
dim match(antal_matcher,2)
dim match1(antal_matcher)
dim matcher_per_lag = 5
for i = 1 to antal_matcher
Dim intHome As Integer = -1
Dim intVisitor As Integer = -1
Dim bolEqual As Boolean = True
Do While bolEqual
intHome = r.Next(0,5)
intVisitor = r.Next(0,6)
If intHome <> intVisitor Then
bolEqual = False
End If
Loop
dim m as string = lag(intHome) &"-"& lag(intVisitor)
dim m1 as string = lag(intVisitor) &"-"& lag(intHome)
dim j as integer
dim k as integer
for k = 0 to i
dim found as boolean = false
for j = 0 to ubound(match1)
if m = match1(j) or m1 = match1(j) then
found = true
exit for
end if
next
if not found then
match(i,1)=lag(intHome)
match(i,2)=lag(intVisitor)
match1(i) = match(i,1)&"-"&match(i,2)
response.write(i &" "& match1(i) & "<br />")
end if
next
next i
ny fråga.
Jag försöker kolla så att inte något av de nya lagen finns i de tidigare positionerna av arrayen men får det inte att fungera.
if i = 2 then
if match(i-1,1) = lag(intHome) or match(i-1,2) = lag(intVisitor) or match(i,1) = lag(intHome) or match(i,2) = lag(intVisitor) then
else
match1(i) = lag(intHome) &"-"& lag(intVisitor)
end if
elseIf i >= 3 Then
if match(i-1,1) = lag(intHome) or match(i-1,2) = lag(intVisitor) or match(i-2,1) = lag(intHome) or match(i-2,2) = lag(intVisitor) or match(i-3,1) = lag(intHome) or match(i-3,2) = lag(intVisitor) or match(i,1) = lag(intHome) or match(i,2) = lag(intVisitor) then
else
match1(i) = lag(intHome) &"-"& lag(intVisitor)
end if
else
match1(i) = lag(intHome) &"-"& lag(intVisitor)
end if
En annan fråga.
kan man på något sätt slumpa en ny match om den slumpade redan finns i arrayen. Om två matcher är lika nu skapas det inte rätt antal matcher
ptypeMedlem sedan juni 2002151 inlägg Har inte orkat kolla på din kod, så jag reserverar mig för missförstånd, men jag tycker det verkar som om du krånglar till det.
Ska alla lag möta alla andra (seriespel)? Lättast då torde ju vara att generera alla möjliga matcher, typ i pseudokod
för L=1:alla lag
för K=1:alla lag utom L
skapa match L möter K
om K>L skapa ej match (om lagen bara ska mötas en gång)
end
end
Spara dessa matcher någonstans och permutera matchordningen slumpartat.
Klart.
alla ska möta varandra en gång. Skulle du kunna ge lite kodexempel på det du visade?
ptypeMedlem sedan juni 2002151 inlägg Förstår du bara vad jag menar med pseudokoden så klarar du nog att implementera det själv.
Jag menar alltså att du ska separera på matchskapningen och lottningen i vilken de spelas, istället för att försöka kombinera dessa två.
Alltså:
1. Strukturerat generera alla matcher som ska spelas och spara undan dessa. Vi vet då att alla matcher kommer med (varken mer eller mindre) och att ingen möter sig själv.
2. Lotta i vilken ordning matcherna ska spelas (t.ex. genom att ett flertal gånger slumpvis dra två matcher från din mängd och byta plats på dem).
jag är med på att jag ska skilja på skapning och lottning men inte riktigt hur koden ska se ut
nu har jag fixat så att alla matcher skapas.
Sen försöker jag slumpa fram ett spelschema. Hur ska jag göra för att kontrollera om matchen redan finns och i så fall slumpa fram en ny?
kod för slumpningen
dim l as integer
dim antal as integer = ubound(match)+1
dim match1(antal)
dim r as new random()
for l = 1 to antal
match1(l) = match(r.Next(0,antal))
response.write(l &" "& match1(l) &"<br />")
next
match är arrayen som innehåller alla matcher
ptypeMedlem sedan juni 2002151 inlägg Jag kodar normalt inte VB, så med reservation för fel:
dim l as integer
dim antal as integer = ubound(match)+1
dim match1(antal)
dim r as new random()
dim slumptal1 as integer
dim slumptal2 as integer
dim tempmatch as match // vet inte hur du definierat match...?
for l = 1 to antal*3 // ett tillräckligt stort tal
slumptal1=r.Next(0,antal)
slumptal2=r.Next(0,antal)
tempmatch=match(slumptal1) // spara undan matchen temporärt
match(slumptal1)=match(slumptal2); // byt plats på matcherna
match(slumptal2)=tempmatch;
next
Nu innehåller arrayen match en slumpvis utvald matchordning.
Hjälper det?
match är definierad så här dim match(21).
Nu slumpar den fram över 50 matcher?
ptypeMedlem sedan juni 2002151 inlägg Nej. Den byter plats på två slumpvis utvalda matcher över 50 ggr. Jag tog siffran ur luften, därför att den (intuititvt, utan att räkna på det) troligtvis låter varje match byta plats åtminstone en gång.
Det är alltså inte fråga om att slumpa fram matcherna nu. Alla matcher som ska spelas finns ju redan. Det gäller bara att sortera dem slumpvis.
Är du med vad jag menar?
jo jag är med. Jag försökte slumpa fram ordningen på ett annat sätt.
dim l as integer
dim antal as integer = ubound(match)+1
dim match1(antal)
dim r as new random()
dim tempmatch as string
for l = 1 to 21
tempmatch = match(r.Next(0,antal))
dim n as integer
for n = 1 to ubound(match1)
if match1(n) = tempmatch then
här vill jag att den ska hoppa tillbaka till slumpningen
else
match1(l) = tempmatch
end if
next
response.write(match1(l) &"<br />")
next
Det fungerar. Den lägger inte till matchen i match1 om den redan finns där.
Men hur gör jag för att hoppa tillbaka till slumpningen om den finns där.
eller är ditt sätt bättre?
ptypeMedlem sedan juni 2002151 inlägg Tror det. Förstår inte riktigt din kod.
Men prova din också då. Vid "här vill jag att den ska hoppa tillbaka till slumpningen", sätt n=ubound(match1) så hoppar du ju ur.
Funkar det inte, så prova min.
*nyfiken*
det jag ögr med min kod är att koll om matchen redan finns i arrayen match1 där jag lagrar den slumpade spelordningen.
Det jag skulle vilja är att hoppa tillbaka ett steg i den första for-satsen och på så sätt slumpa fram en ny match men det verkar inte fungera
provade med att göra så här
dim n as integer
for n = 1 to ubound(match1)
if match1(n) = tempmatch then
l=l-1
else
match1(l) = tempmatch
end if
next
men det verkar bli en evighetsloop.
ptypeMedlem sedan juni 2002151 inlägg Ok. Verkar krångligt tycker jag. Prova min version. :OO
Om jag gör på ditt sätt. Jag måste väl fortfarande kontrollera att samma match inte lottas in i spelschemat flera gånger?
ptypeMedlem sedan juni 2002151 inlägg Nej! Inte om du skapat alla matcher korrekt!
Alla matcher är skapade korrekt och jag vet att det ska vara 21 matcher (det är 7 lag) provade din kod så här
dim l as integer
dim antal as integer = ubound(match)+1
dim match1(antal)
dim r as new random()
dim slumptal1 as integer
dim slumptal2 as integer
dim tempmatch as string
for l = 1 to antal
slumptal1=r.Next(0,antal)
slumptal2=r.Next(0,antal)
tempmatch=match(slumptal1)
match(slumptal1)=match(slumptal2)
match(slumptal2)=tempmatch
response.write(tempmatch &"<br />")
next
När jag kör den där koden blir det inte rätt
ptypeMedlem sedan juni 2002151 inlägg Varför skriver du ut tempmatch? Det är ju fel. Loopa igenom match från 1 till 21 och skriv ut alla matcher istället.
Sen har du ändrat loopen. Den är inte som den jag skrev. Du slumpar för få gånger (antal istället för antal*3).
Så här menar jag:
for l = 1 to antal*3 // ett tillräckligt stort tal
slumptal1=r.Next(0,antal)
slumptal2=r.Next(0,antal)
tempmatch=match(slumptal1) // spara undan matchen temporärt
match(slumptal1)=match(slumptal2); // byt plats på matcherna
match(slumptal2)=tempmatch;
next
for l=1 to antal
response.write(match(l) &"<br />")
next