Hejsan! En variant med lite mindre kod :) Vad menar du med att du inte har lyckats något vidare? Johan : din kod är Ok men den har ett litet fel. Sven, i frågan kan du läsa "Jag håller på med ett litet program som skall ta fram sju stycken slumpvalda siffror <b>0 - 34</b>." :) Jo... jag är medveten om det men jag är ganska övertygad om att han vill ha Jag har stött på ett litet problem med denna slumgenerator. Om jag sätter "Const AntalVal As Integer = 12" Så låser sig programmet. Men om jag ändrar till 7 och tar bort de sista sex looparna så fungerar det. Klarar denna inte av fler än 6 loopar? Eller är det något som inte stämmer med koden? Hej Morgan! I varje loop så slumpar du ju så många tal som AntalVal innehåller. Att du måste allokera upp 144 platser i arrayen (som du kallar Vald). Varför slumpar du fram så många värden? Jag antar att egenskapen Picture bara kan innehålla ett värde, så då skriver du ju över värdet hela tiden så att bara det sista används. Varför jag slumpar är därför att en kortlek innehåller 52 kort. Och då måste jag försöka slumpa fram så många kort jag behöver utan att de blir identiska. Alla tal används för att plocka fram just sitt kort till en Picture... Tjaaa, du Morgan, Hur många värden försöker du slumpa fram, då? Du kan ju inte slumpa fram fler kort än det finns i kortleken. En annan liten detalj.Du behöver bara skriva Randomize en gång. Du har helt rätt det gick åt skogen... det totala antalet kort skall vara 17. Tog då och delade med 6 men då blev det 3 hjärter 5 =). Det är ingen av er som har förslag på hur man skulle kunna göra för att slumpa fram 17 variabler med ett unikt värde var ur 52? Då skulle det bli mycket mindre kod =) Nåt sånt här kanske...??? Det var ju samma kod som inan... Ja just det. Lägg dom i en array. Jag har aldrig arbetat med Array, Så det är lite klurigt har provat fram och tillbaka nu men det fungerar inget vidare. Skall det vara något liknande: Hej! Jag har nu provat ett x - antal försök att med Array få det hela att fungera. Jag har försökt med ett mindre antal kort (7) och då fungerar det prima. Men när jag lägger in det i det större programmet på 17 kort fungerar det inte. Det lilla programmet ser ut på följande sätt... Vad är det som inte funkar med 17? Får du felmeddelande? Vad händer? När du använder 17 har du då deklarerat om Dim SlumpArr(7) As Integer till Dim SlumpArr(17) As Integer och Const AntalVal As Integer = 7 till Const AntalVal As Integer = 17 ? Hej Morgan! Då vill jag bara klargöra att allt fungerar som det skall, och med betydligt mindre kod än vad jag hade lagt ner tid på från början=). Tack Håkan Borneland för hjälpen och tipsen som varit väldigt lärorika. Kul att du fick det att fungera, när du "kämpade" så med detta.Loop
Jag håller på med ett litet program som skall ta fram sju stycken slumpvalda siffror 0 - 34. Saken är den at ingen siffra får vara den andra lik. Har försökt med ett flertal olika kombinationer men inte lyckats något vidare. Allt fungerar vad det gäller slumpgeneratorn osv... Jag skickar med en översikt:
------------------------------------
optOne.Value = True
If optOne.Value = True Then
Do
Randomize
tal1 = Int(Rnd * 3)
tal2 = Int(Rnd * 34)
a = tal1 + tal2
Loop Until a <= 34
optOne.Value = False
imgBild01.Picture = PictureClip1.GraphicCell(a)
optTwo.Value = True
End If
If optTwo.Value = True Then
Do
Randomize
tal1 = Int(Rnd * 3)
tal2 = Int(Rnd * 34)
b = tal1 + tal2
Loop Until b <= 34
If b = a Then
Do
Randomize
tal1 = Int(Rnd * 3)
tal2 = Int(Rnd * 34)
b = tal1 + tal2
Loop Until b <= 34
End If
optTwo.Value = False
imgBild02.Picture = PictureClip1.GraphicCell(b)
optThree.Value = True
End If
If optThree.Value = True Then
Do
Randomize
tal1 = Int(Rnd * 3)
tal2 = Int(Rnd * 34)
c = tal1 + tal2
Loop Until c <= 34
If c = a And b Then
Do
Randomize
tal1 = Int(Rnd * 3)
tal2 = Int(Rnd * 34)
c = tal1 + tal2
Loop Until c <= 34
End If
optThree.Value = False
imgBild01.Picture = PictureClip1.GraphicCell(c)
optFour.Value = True
End If
-----------------------------------
Detta var en del av koden för det 3 första siffrorna. Om någon har en lösning på problemet så vore jag tacksam...
MVH: AlexSv: Loop
Const AntalValbara As Integer = 35
Const AntalVal As Integer = 7
Dim Vald() As Boolean
ReDim Vald(AntalValbara)
Randomize
Dim i As Integer
Dim Slumpad As Integer
For i = 1 To AntalVal
Do
Slumpad = Int(Rnd * AntalValbara)
Loop Until Not Vald(Slumpad)
Vald(Slumpad) = True
'här är Slumpad det "unika" talet
Debug.Print Slumpad
Next
/Johan
Sv: Loop
Jag ser några brister i koden:
Ifall b är lika med a så slumpar du ett nytt värde på b, men du har ju ingen kontroll på om det nya värdet i b är lika med a. Du måste ju loopa tills du får ett värde som är skilt ifrån a.
Den här If-satsen fungerar inte alls:
If c = a And b Then
Du måste jämföra varje värde för sig, alltså:
If c = a And c = b Then
Men det räcker inte, eftersom a och b ska vara olika så kan ju aldrig c samtidigt vara lika med a och lika med b. Du får använda Or för att kontrollera ifall c är lika med något av värdena:
If c = a Or c = b Then
Det blir ju ganska mycket kod när du ska jämföra det sista värdet med de sju föregående. Ifall du lagrar värdena i en array istället så kan du ju göra en loop som slumpar fram alla värdena.Sv: Det löste sig med den kortare varianten =)
Den släpper genom noll(0) och genererar aldrig 35 som jag tror att han vill ha.
Ser ut som Lotto slump.
Så här bör den justeras.
<code>
Slumpad = Int(Rnd * AntalValbara) + 1
</code>Sv:Det löste sig med den kortare varianten =)
/JohanSv: Det löste sig med den kortare varianten =)
1- 35 7 nummer typisk Lotto Slump.
Edit:
Ok jag ger mig när jag ser hans kod.Han plockar bilder från 0-34. Dvs. 35 st.Sv:Loop
Private Sub cmdStart_Click()
Const AntalValbara As Integer = 52
Const AntalVal As Integer = 12
Dim Vald() As Boolean
ReDim Vald(AntalValbara)
Randomize
Dim a As Integer
Dim Slump01 As Integer
For a = 1 To AntalVal
Do
Slump01 = Int(Rnd * AntalValbara)
Loop Until Not Vald(Slump01)
Vald(Slump01) = True
imgPlay0101.Picture = PictureClip1.GraphicCell(Slump01)
Next
Randomize
Dim b As Integer
Dim Slump02 As Integer
For b = 1 To AntalVal
Do
Slump02 = Int(Rnd * AntalValbara)
Loop Until Not Vald(Slump02)
Vald(Slump02) = True
imgPlay0102.Picture = PictureClip1.GraphicCell(Slump02)
Next
Randomize
Dim c As Integer
Dim Slump03 As Integer
For c = 1 To AntalVal
Do
Slump03 = Int(Rnd * AntalValbara)
Loop Until Not Vald(Slump03)
Vald(Slump03) = True
imgPlay0201.Picture = PictureClip1.GraphicCell(Slump03)
Next
Randomize
Dim d As Integer
Dim Slump04 As Integer
For d = 1 To AntalVal
Do
Slump04 = Int(Rnd * AntalValbara)
Loop Until Not Vald(Slump04)
Vald(Slump04) = True
imgPlay0202.Picture = PictureClip1.GraphicCell(Slump04)
Next
Randomize
Dim e As Integer
Dim Slump05 As Integer
For e = 1 To AntalVal
Do
Slump05 = Int(Rnd * AntalValbara)
Loop Until Not Vald(Slump05)
Vald(Slump05) = True
imgPlay0301.Picture = PictureClip1.GraphicCell(Slump05)
Next
Randomize
Dim f As Integer
Dim Slump06 As Integer
For f = 1 To AntalVal
Do
Slump06 = Int(Rnd * AntalValbara)
Loop Until Not Vald(Slump06)
Vald(Slump06) = True
imgPlay0302.Picture = PictureClip1.GraphicCell(Slump06)
Next
Randomize
Dim g As Integer
Dim Slump07 As Integer
For g = 1 To AntalVal
Do
Slump07 = Int(Rnd * AntalValbara)
Loop Until Not Vald(Slump07)
Vald(Slump07) = True
imgPlay0401.Picture = PictureClip1.GraphicCell(Slump07)
Next
Randomize
Dim h As Integer
Dim Slump08 As Integer
For h = 1 To AntalVal
Do
Slump08 = Int(Rnd * AntalValbara)
Loop Until Not Vald(Slump08)
Vald(Slump08) = True
imgPlay0402.Picture = PictureClip1.GraphicCell(Slump08)
Next
Randomize
Dim i As Integer
Dim Slump09 As Integer
For i = 1 To AntalVal
Do
Slump09 = Int(Rnd * AntalValbara)
Loop Until Not Vald(Slump09)
Vald(Slump09) = True
imgPlay0501.Picture = PictureClip1.GraphicCell(Slump09)
Next
Randomize
Dim j As Integer
Dim Slump10 As Integer
For j = 1 To AntalVal
Do
Slump10 = Int(Rnd * AntalValbara)
Loop Until Not Vald(Slump10)
Vald(Slump10) = True
imgPlay0502.Picture = PictureClip1.GraphicCell(Slump10)
Next
Randomize
Dim k As Integer
Dim Slump11 As Integer
For k = 1 To AntalVal
Do
Slump11 = Int(Rnd * AntalValbara)
Loop Until Not Vald(Slump11)
Vald(Slump11) = True
imgPlay0601.Picture = PictureClip1.GraphicCell(Slump11)
Next
Randomize
Dim l As Integer
Dim Slump12 As Integer
For l = 1 To AntalVal
Do
Slump12 = Int(Rnd * AntalValbara)
Loop Until Not Vald(Slump12)
Vald(Slump12) = True
imgPlay0602.Picture = PictureClip1.GraphicCell(Slump12)
Next
End Sub
MVH: AlexSv: Loop
Det är matten som "skiter" sig.. ;-)
Du har en array med 52 platser, men 12 * 12 = 144.
Alltså får du en evighetsloop när programmet letar efter en ledig plats för 53dje siffran.
//HåkanSv: Loop
Ifall du har 52 valbara (även om arrayen kommer att ha 53 poster) så räcker det ju bara till fyra loopar om du slumpar 12 i varje loop.Sv: Loop
Skapa en ny variabel för det, som du tilldelar 144.
Variabeln "AntalValbara" som du tilldelar 52 behåller du,
då den styr "taket" för de slumpade värdena.
Om du inte redan vet det, så kommer 52 aldrig att slumpas fram.
EDIT: Fort och fel blev det, det krävs en annan lösning.
//HåkanSv: Loop
Sv:Loop
Jag löste problemet genom att skriva:
Loop Until Not Vald(Slump01) / 4
Loop Until Not Vald(Slump02) / 4
Loop Until Not Vald(Slump03) / 4
OSV...
Om det finns ett enklare sätt att slumpa fram 12 olika nummer kan ni väl höra av er. Nu verkar det i alla fall fungera.
Tack / MorganSv: Loop
Lösningen ovan fungerade så länge du höll dig till 52.
Som du skrev så finns det bara 52 kort i leken.
Nu har inte jag "the big picture", så därför kanske frågan blir fel.
Min fråga är: du kan ju inte loopa ut mer kort än leken innehåller, blir det inte fel där?
Som sagt så har jag säkert inte förstått vad du vill göra, har du 12 kortlekar som du väljer i från?
//HåkanSv: Loop
Du skrev att du skrev:
Loop Until Not Vald(Slump01) / 4
Vad försöker du åstadkomma med den koden? Du delar en boolean med fyra (eller egentligen är det ju bara en boolean om posten är vald, annars är den ju Empty eftersom du inte lagt in några värden i arrayen från början). Den enda förändring som den ändringen egentligen kan åstadkomma är att du får dubbletter.Sv:Loop
Det gör du bäst i Form_Load sen gäller det så länge programmet går.
Några brukar skriva Randomize Timer så att Timern:s 1000:delar skall bli "frö"
Det är onödigt Timern är default vald som "frö"Sv:Loop
Så nu är jag väl tillbaka på ruta 0 igen då.
// MorganSv: Loop
Sv:Loop
Const AntalValbara As Integer = 53
Const AntalVal As Integer = 17
Dim Vald() As Boolean
ReDim Vald(AntalValbara)
Randomize
Dim a As Integer
Dim Slump As Integer
For a = 1 To AntalVal
Do
Slump = Int(Rnd * AntalValbara)
Loop Until Not Vald(Slump)
Vald(Slump) = True
Debug.Print Slump
Next
EDIT: har ändrat lite...
//Håkan
Sv: Loop
Man kan inte sätta a = 1, b=2 osv, Eller hör det inte hit?Sv:Loop
Den slumpar fram 17 olika tal, var inte det det du ville?
I så fall har jag missförstått helt.
//HåkanSv:Loop
Använd a i For loopen, i koden ovan som index.
Ex:Const AntalValbara As Integer = 53
Const AntalVal As Integer = 17
Dim Vald() As Boolean
Dim SlumpArr(17) As Integer
ReDim Vald(AntalValbara)
Randomize
Dim a As Integer
Dim SlumpTal As Integer
For a = 1 To AntalVal
Do
SlumpTal = Int(Rnd * AntalValbara)
Loop Until Not Vald(SlumpTal)
Vald(SlumpTal) = True
SlumpArr(a) = SlumpTal
Debug.Print SlumpArr(a)
Next
//Håkan
Sv: Loop
"Någonting" = Array(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q)
imgPlay0101.Picture = PictureClip1.GraphicCell(någonting(a))
imgPlay0102.Picture = PictureClip1.GraphicCell(någonting(b))
osv...
Eller är jag helt ute och cyklar...
Nu skall jag i alla fall försöka koppla bort programmerandet för idag. Men om du har någe tips är det ju bara att skriva. Jag är tacksam för den hjälp jag kan få. Man lär sig ju av att sitta och traggla =).
// MorganSv:Loop
Du lägger in värden i arrayen som i exemplet ovan.
Du hämtar ut värden genom att skriva t.ex. MinArray(2).
Tvåan betyder att du hämtar värdet på "plats" (index) 2 i arrayen.
Array(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q) skriver man inte.
Ska du lägga in eller ta ut flera värden åt gången, är det oftast en loop som gäller.
//HåkanProblemet kvarstår...
-------------------------------------------------------------------------
Private Sub cmdDeal_Click()
Const AntalValbara As Integer = 52
Const AntalVal As Integer = 7
Dim Vald() As Boolean
Dim SlumpArr(7) As Integer
ReDim Vald(AntalValbara)
Dim Slump As Integer
Dim a As Integer
For a = 1 To AntalVal
Do
Slump = Int(Rnd * AntalValbara)
Loop Until Not Vald(Slump)
Vald(Slump) = True
SlumpArr(1) = Slump
imgCard01.Picture = PictureClip1.GraphicCell(SlumpArr(1))
Next
Dim b As Integer
For b = 1 To AntalVal
Do
Slump = Int(Rnd * AntalValbara)
Loop Until Not Vald(Slump)
Vald(Slump) = True
SlumpArr(2) = Slump
imgCard02.Picture = PictureClip1.GraphicCell(SlumpArr(2))
Next
Dim c As Integer
For c = 1 To AntalVal
Do
Slump = Int(Rnd * AntalValbara)
Loop Until Not Vald(Slump)
Vald(Slump) = True
SlumpArr(3) = Slump
imgFlop01.Picture = PictureClip1.GraphicCell(SlumpArr(3))
Next
Dim d As Integer
For d = 1 To AntalVal
Do
Slump = Int(Rnd * AntalValbara)
Loop Until Not Vald(Slump)
Vald(Slump) = True
SlumpArr(4) = Slump
imgFlop02.Picture = PictureClip1.GraphicCell(SlumpArr(4))
Next
Dim e As Integer
For e = 1 To AntalVal
Do
Slump = Int(Rnd * AntalValbara)
Loop Until Not Vald(Slump)
Vald(Slump) = True
SlumpArr(5) = Slump
imgFlop03.Picture = PictureClip1.GraphicCell(SlumpArr(5))
Next
Dim f As Integer
For f = 1 To AntalVal
Do
Slump = Int(Rnd * AntalValbara)
Loop Until Not Vald(Slump)
Vald(Slump) = True
SlumpArr(6) = Slump
imgTurn.Picture = PictureClip1.GraphicCell(SlumpArr(6))
Next
Dim g As Integer
For g = 1 To AntalVal
Do
Slump = Int(Rnd * AntalValbara)
Loop Until Not Vald(Slump)
Vald(Slump) = True
SlumpArr(7) = Slump
imgRiver.Picture = PictureClip1.GraphicCell(SlumpArr(7))
Next
End Sub
Private Sub Form_Load()
Randomize
End Sub
-------------------------------------------------------------------------
Om det finns någon rimlig och vettig förklaring och ev. en lösning så vill jag gärna ha den. Har nu suttit i fyra dygn med detta problem... Jag tänker ge det 1 dygn till sedan får det vara...
/ MorganSv: Problemet kvarstår...
Sv: Problemet kvarstår...
Kolla in följande:Const AntalValbara As Integer = 53
Const AntalVal As Integer = 17
Dim Vald() As Boolean
Dim SlumpArr(17) As Integer
ReDim Vald(AntalValbara)
Dim Slump As Integer
Dim a As Integer
For a = 1 To AntalVal
Do
Slump = Int(Rnd() * AntalValbara)
Loop Until Not Vald(Slump)
Vald(Slump) = True
SlumpArr(a) = Slump
Next
imgCard01.Picture = PictureClip1.GraphicCell(SlumpArr(1))
imgCard02.Picture = PictureClip1.GraphicCell(SlumpArr(2))
imgFlop01.Picture = PictureClip1.GraphicCell(SlumpArr(3))
imgFlop02.Picture = PictureClip1.GraphicCell(SlumpArr(4))
imgFlop03.Picture = PictureClip1.GraphicCell(SlumpArr(5))
imgTurn.Picture = PictureClip1.GraphicCell(SlumpArr(6))
imgRiver.Picture = PictureClip1.GraphicCell(SlumpArr(7))
någonting = PictureClip1.GraphicCell(SlumpArr(8))
någonting = PictureClip1.GraphicCell(SlumpArr(9))
någonting = PictureClip1.GraphicCell(SlumpArr(10))
någonting = PictureClip1.GraphicCell(SlumpArr(11))
någonting = PictureClip1.GraphicCell(SlumpArr(12))
någonting = PictureClip1.GraphicCell(SlumpArr(13))
någonting = PictureClip1.GraphicCell(SlumpArr(14))
någonting = PictureClip1.GraphicCell(SlumpArr(15))
någonting = PictureClip1.GraphicCell(SlumpArr(16))
någonting = PictureClip1.GraphicCell(SlumpArr(17))
Loopen laddar arrayen med 17 slumpade tal.
Nu har du alltså 17 slumptal på ETT ställe.
Sedan kan du plocka ut dom rakt av.
Jag har skrivit "någonting" på plats 8 - 17, då jag inte vet vad du ska tilldela där.
Bara att byta ut "någonting", och skriva in det som du gör i det stora programmet.
//Håkan
Då fungerar Slumpandet...
// MorganSv: Då fungerar Slumpandet...
Lycka till med fortsättningen.
//Håkan