Avatar billede virtualdurran Nybegynder
03. maj 2006 - 12:54 Der er 29 kommentarer og
3 løsninger

avanceret Random funktion

Jeg har 5 navne skrevet ind i en textbox i en userform. Disse 5 navne har hver en værdi fra 1-10, som er valgt ud fra en combobox ud fra hver navn. Jeg skal nu have en randomfunktion, som vælger et tilfældigt navn, men som samtidig tager højde for tallet som er tildelt det enkelte navn. Altså hvis navnet har fået et 10-tal, skal der være større chance for at det bliver valgt, end et navn som kun har fået 5. Kan det lade sig gøre?

På forhånd tak
Avatar billede martin_moth Mester
03. maj 2006 - 12:59 #1
ja.

F.eks.

Hvert af de 5 navne har 1-10 points.

Tæl sammen hvor mange points der er i alt (mellem 5 og 50), lad os sige der er 20 points i alt.

Lav et array der har 20 pladser

Smid hert navn lige så mange ind i arrayet som det har fået points

Find et tilfældigt tal X mellem 1 og 20

Tag navnet på plads X i arrayet
Avatar billede virtualdurran Nybegynder
03. maj 2006 - 13:03 #2
et array? Der var så også lige en ting jeg ik ved hvordan jeg laver?
Avatar billede virtualdurran Nybegynder
03. maj 2006 - 13:03 #3
Kan godt se ideen i det du siger, men ved ikke hvad et array er. Hvordan laver jeg sådan et?
Avatar billede martin_moth Mester
03. maj 2006 - 13:10 #4
f.eks

Per: 2 points
Søren: 1 points
Lisa: 10 points
Ole: 5 points
Kaj: 2 points

I alt 20 points.

Du laver et array arr_Navne() der indeholder:

Plads nr  / Navn
1: Per
2: Per
3: Søren
4: Lisa
5: Lisa
6: Lisa
7: Lisa
8: Lisa
9: Lisa
10: Lisa
11: Lisa
12: Lisa
13: Lisa
14: Ole
15: Ole
16: Ole
17: Ole
18: Ole
19: Kaj
20: Kaj

Her efter tager du et tal mellem 1 og 20:

randomize
x = Int(20*Rnd + 1)

Og vælger det tilfældige navn
TilfaeldigtNavn = arrNavne(x)

NB: I ovenstående starter arrayet ved 1, og ikke ved nul. Det bestemmer du jo selv om du synes er en god ide. Du skal kunen finde ud af at bruge dynamiske arrays, fordi størrelsen hele tiden skifter, hver gang du tildeler nye points. Kan du finde ud af det?
Avatar billede martin_moth Mester
03. maj 2006 - 13:10 #5
kender du ikek et array???

2 sek
Avatar billede virtualdurran Nybegynder
03. maj 2006 - 13:15 #6
Nej...kender det OVERHOVEDET ik...ved ik hvordan jeg laver det, så hvis jeg kunne lokke dig til at lave en kode der gør det, ville alt bare være super :)
Avatar billede martin_moth Mester
03. maj 2006 - 13:43 #7
så kan du ikek have programmeret ret meget;o) - koden kommer lige om lidt
Avatar billede virtualdurran Nybegynder
03. maj 2006 - 13:47 #8
hehe...det har jeg jo heller aldrig sagt jeg kunne! :D
Avatar billede virtualdurran Nybegynder
03. maj 2006 - 13:50 #9
Forresten...lige en lille ekstra, nu du er så super til VBA. Hvorfor får jeg en runtime error når jeg skriver koden:
userform1.combobox1.additem "1", "1" ??
Avatar billede martin_moth Mester
03. maj 2006 - 13:55 #10
OK: Der er arrays (tabeller) og kontraoarrays i VB. Arrays kan være dynamiske (variabel størrelse) eller statiske (fast størrelse, mest almindeligt)

----------"ALMINDELIGE ARRAYS"-------------

Et array er bare en samling værdier i en tabel - f.eks. 10 stykekr tekst, 20 tal, eller noget andet.

Det laves sådan her:

Dim MitArray(3) as String '3tallet betyder at der er 3 pladser i tabellen
Mitarray(0) = "Hej"
Mitarray(1) = "med"
Mitarray(2) = "dig"

Hvis du så herefter skriver MitArray(2) har det værdiern "med"

Hvis du skriver MitArray(0) = "Farvel" skifter du "Hej" ud med Farvel

----------"DYNAMSIKE ARRAYS"-------------
Ligesom statiske, men man angiver ikke størrelsen. Derfor kan man skifte størrelse undervejs.


----------"KOntrol ARRAYS"-------------

Det er arrays med kontroller (f.eks. textboxe, comboboxe). Det betyder bare, at flere kontroller af samme slags hedder det samme, men hver har et index. De laves ved at man smider en kontrol (fx. en textbox) på sin form, markerer den, trykker Ctrl+C, herefter Ctrl+V, og siger JA til at oprette et kontrolarray. Skal der være 5 textboxe i et kontrolarray gør du det 5 gange.



DIN OPGAVE:

Læs og forsøg at forstå ovenstående. Herefter opretter du en helt ny form. Læg en textbox (Text1) og en combobox (Combo1) på din nye form. Og en knap (Command1)

Nu markerer du textboxen, kopierer den (Ctrl+C), indsætter en ny (Ctrl+V), og siger JA til at oprette et kontrolarray. Den nye textbox lægger du under den første. Gør det indtil du har 5 textboxe og 5 comboboxe.

Herefter copy-paster du koden i næste kommentar, og dit program virker 100%
Avatar billede martin_moth Mester
03. maj 2006 - 13:57 #11
Option Explicit

Private Sub Form_Load()
    Dim i As Byte 'Bare en variabel til at tælle med
    Dim j As Byte 'Bare en variabel til at tælle med
   
'Når dit program startes fyldes værdierne 1..10 i comboboxene
    For j = 0 To 4
        Combo1(j).Clear
        For i = 1 To 10
        Combo1(j).AddItem i
        Next i
        Combo1(j).ListIndex = j * 2 + 1 'forhåndsvælger værdierne 2,4,6,8,10 i combo'erne
    Next j

'Når dit program startes fyldes der nogle standardnavne i textboxene
    Text1(0).Text = "Per"
    Text1(1).Text = "Lisa"
    Text1(2).Text = "Lotte"
    Text1(3).Text = "Susanne"
    Text1(4).Text = "Søren"
End Sub

Private Sub Command1_Click()
  'Finder antal points
  Dim i As Byte 'Bare en variabel til at tælle med
  Dim j As Byte 'Bare en variabel til at tælle med
  Dim k As Byte 'Bare en variabel til at tælle med
  Dim Pointsum As Byte 'Indeholder antal points i alt
  Dim arrNavne() As String
  Dim strDummy As String 'En midlertidig variabel
 
  For i = 0 To 4
    Pointsum = Pointsum + Val(Combo1(i).List(Combo1(i).ListIndex))
  Next i
 
  ReDim arrNavne(Pointsum)
  For i = 0 To 4 'looper igennem alle textboxene
    For j = 1 To Val(Combo1(i).List(Combo1(i).ListIndex)) 'looper fra 1 - antal points navnet
      arrNavne(k) = Text1(i).Text
      k = k + 1
    Next j
  Next i
 
  'Skriver hele arrayet ud i en msxbox for at kontrollere - det kan du bare slette i dit endelige program
 
'START KONTROL
  For i = 0 To Pointsum - 1
    strDummy = strDummy & arrNavne(i) & " - "
  Next i
  strDummy = strDummy & "IKKE FLERE NAVNE, ialt: " & Pointsum
  MsgBox strDummy
'SLUT KONTROL
 
  'Finder et tilfældigt tal j mellem 1 og Pointsum
  Randomize
  j = Int(Pointsum * Rnd)

  'Finder et tilfældigt navn, efter "vægtet sandsynlighed"
 
  MsgBox "Følgende navn er udtrukket: " & arrNavne(j), vbOKOnly + vbCritical
   
End Sub
Avatar billede martin_moth Mester
03. maj 2006 - 13:58 #12
Nu skal du ikek sige at du bruger VBA, vel? Du bruger VB6, ikke?

Kontrolarrays bruges ikek i VBA
Avatar billede virtualdurran Nybegynder
03. maj 2006 - 14:05 #13
jeg bruger vba...det er jo i excel
Avatar billede martin_moth Mester
03. maj 2006 - 14:09 #14
"det er jo i excel"

Hvor fremgår det? - du er trods alt i en Visual Basic kategori...

Nå - løsningen er densammen, men alle loope over kontroller må du skifte ud og skrive de enkelte kontrollers navne. Det kommer til at fylde noget mere, men ændrer ikke ved løsningens princip

PS: En anden gang, start lige med at skriv hvilken software du bruger, hvis du ikek bruger det kategorien handler om, ikke?
Avatar billede martin_moth Mester
03. maj 2006 - 14:11 #15
Sådan retter du til:

For i = 0 To 4
    Pointsum = Pointsum + Val(Combo1(i).List(Combo1(i).ListIndex))
Next i

erstattes med

Pointsum = Pointsum + Val(Combo1.List(Combo1.ListIndex))
Pointsum = Pointsum + Val(Combo2.List(Combo2.ListIndex))
Pointsum = Pointsum + Val(Combo3.List(Combo3.ListIndex))
Pointsum = Pointsum + Val(Combo4.List(Combo4.ListIndex))
Pointsum = Pointsum + Val(Combo5.List(Combo5.ListIndex))

Osv i alle de andre loops
Avatar billede virtualdurran Nybegynder
03. maj 2006 - 14:19 #16
Okay...så lige en helt anden ting. Hvad kan jeg programmere VB6 i?
Avatar billede virtualdurran Nybegynder
03. maj 2006 - 14:30 #17
Jeg har brugt din kode til at indsætte tallene i ComboBoxene, men har ændre den til dette

With UserForm1
        .ComboBox1.Clear
        .ComboBox2.Clear
        .ComboBox3.Clear
        .ComboBox4.Clear
        .ComboBox5.Clear
        For i = 1 To 10
        .ComboBox1.AddItem i
        .ComboBox2.AddItem i
        .ComboBox3.AddItem i
        .ComboBox4.AddItem i
        .ComboBox5.AddItem i
        Next i
        .ComboBox1.ListIndex = j * 2 + 1 'forhåndsvælger værdierne 2,4,6,8,10 i combo'erne
        .ComboBox2.ListIndex = j * 2 + 1
        .ComboBox3.ListIndex = j * 2 + 1
        .ComboBox4.ListIndex = j * 2 + 1
        .ComboBox5.ListIndex = j * 2 + 1
End With

Det virker dog ikke. Gør jeg noget forkert?
Avatar billede virtualdurran Nybegynder
03. maj 2006 - 14:33 #18
Glem sidste kommentar. Det virker nu! :D
Avatar billede martin_moth Mester
03. maj 2006 - 14:35 #19
start med at fortæl hvad der går galt og hvor - tror du ikke det er fordi du bruger j, og jeg ikke har en værdi, måske slet ikke er oprettet?

Prøv at ret de sidste 5 linier til

        .ComboBox1.ListIndex = 1
        .ComboBox2.ListIndex = 3
        .ComboBox3.ListIndex = 5
        .ComboBox4.ListIndex = 7
        .ComboBox5.ListIndex = 9
Avatar billede martin_moth Mester
03. maj 2006 - 14:35 #20
du kan programmere VB6 i VB6
Avatar billede virtualdurran Nybegynder
03. maj 2006 - 14:45 #21
jamen den gav bare ingen værdier i mine comboboxe. Men det var bare fordi jeg havde sat koden ind på en forkert knap. Jeg har fået det til at virke nu. og det med at jeg brugte j, så jeg så også lige da jeg havde sat det ind.
Avatar billede martin_moth Mester
03. maj 2006 - 14:49 #22
ok Du behøver jo  ikke gøre som jeg gør - det var bare et forslag. Ideen er bare at fylde navne i et array, jo højere antal points jo flere gange er navnet i arrayet, og jo mere sandsynligt er det at det bliver udtrukket. Har du en mail, så kan du for sjovt få VB6-programmet
Avatar billede virtualdurran Nybegynder
03. maj 2006 - 14:50 #23
Jeg kan ikke helt se hvordan du vil lave den her kode om til noget jeg kan bruge? mine textboxe hedder TextBox1-5

  ReDim arrNavne(Pointsum)
  For i = 0 To 4 'looper igennem alle textboxene
    For j = 1 To Val(Combo1(i).List(Combo1(i).ListIndex)) 'looper fra 1 - antal points navnet
      arrNavne(k) = Text1(i).Text
      k = k + 1
    Next j
  Next i
Avatar billede virtualdurran Nybegynder
03. maj 2006 - 14:51 #24
Jamen det vil jeg da gerne ha.
min mail er: jacobflop@hotmail.com
Avatar billede martin_moth Mester
03. maj 2006 - 15:09 #25
er sendt
Avatar billede martin_moth Mester
03. maj 2006 - 15:29 #26
Kan du bruge det? Husk at lukke spørgsmålet når du har fået svar nok
Avatar billede maagefinke Nybegynder
03. maj 2006 - 16:50 #27
>Hej martin moth - Ved control1(j).clear får jeg denne fejlmeddelelse når jeg prøver at køre dit program: wrong numer of arguments or invalid property assignment?
Jeg har kopieret koden over for at se, hvordan den fungerer.
Kan jeg så have gjort noget forkert. Jeg har VB6.
Avatar billede martin_moth Mester
03. maj 2006 - 17:01 #28
Hvis du har VB6 copy-paster du koden jeg har skrevet. Den virker, hvis du har lavet dine kontroller som kontrolarrays med index 0-4
Avatar billede martin_moth Mester
03. maj 2006 - 17:01 #29
Hvis du har VB6 så download koden jeg har lagt op, som angivet i den mail jeg sendte dig
Avatar billede martin_moth Mester
03. maj 2006 - 17:05 #30
Smid en mail når du har gjort det, så jeg kan slette filerne igen
Avatar billede martin_moth Mester
03. maj 2006 - 22:42 #31
eller lad være. Sletter filerne nu
Avatar billede martin_moth Mester
05. maj 2006 - 12:59 #32
Selv tak, det var så lidt
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester