Elikkäs ongelma on semmonen että ohjelmassa on 7 muuttujaa,
muuttujat saavat jokainen satunnaisen arvon väliltä 1-39 (ei varmaan tarvitse sanoa että homman nimi liittyy lottoamiseen). Miten lukuarvot saisi arvottua mahdottoman nopealla tavalla niin, että muuttujien arvoiksi ei muodostuisi koskaan samoja lukuja. Ehtolauseilla varsin työläs toteutettava...eli yksinkertaisesti sanottuna miten on järkevintä toteuttaa ohjelma joka arpoo lottorivin?
No eihän tohon nyt kovin montaa riviä ehtolauseilla menis... Mutta kai se on makuasia miten lyhyeks sen koodin haluaa.
Yksi keino on taulukoida arvot ja aina arvonnan jälkeen poistaa viimeksi arvottu luku, jonka jälkeen sitä ei enää arvota.
Kannattaa ensin panna kaikki mahdolliset numerot taulukkoon. Aluksi arvotaan numero väliltä 1 - 39 ja valitaan taulukosta vastaava numero (joka tietysti on sama). Sitten taulukon viimeinen numero siirretään arvotun kohdalle. Seuraavalla kierroksella arvotaan numero väliltä 1 - 38. Jne. Näin täytyy arpoa vain seitsemän numeroa, ja samaa numeroa ei kuitenkaan voi tulla.
Dim numerot(1 To 39) As Integer
Dim arvotut(1 To 7) As Integer
Dim i As Integer, a As Integer
' pannaan numerot 1 - 39 taulukkoon
For i = 1 To 39
numerot(i) = i
Next
' alustetaan satunnaislukugeneraattori
Randomize Timer
' arvotaan seitsemän numeroa
For i = 1 To 7
' arvotaan taulukon kohta:
' 1. kierroksella 1 - 39
' 2. kierroksella 1 - 38 jne.
a = Int(Rnd * (40 - i)) + 1
' arvottu numero talteen
arvotut(i) = numerot(a)
' viimeinen numero arvotun tilalle
numerot(a) = numerot(40 - i)
' näytetään arvottu numero
MsgBox arvotut(i)
Nextheh, kiitoksia paljon. Mutta tässäpä tulikin heti toinen probleema, eli miten nuo arvotut numerot saisi suuruusjärjestykseen? :) olen ihan käsi taulukoiden käsittelyssä, löytyykö VBstä kenties joku komento joka järjestää luvut suoraan pienimmästä suurimpaan tai päinvastoin?
käytät < ja > merkkejä esim
if luku1 < luku2 then text1.text=luku1 else if luku2 < luku3 then text2.text=luku2
jne
Bubble Sort:
Dim Siirto As Boolean
Dim Arvot(10) As String 'string join:n takia arvojen tulostamisessa
Dim i As Integer
Dim msg As String, abu As String
Randomize Timer
For i = 0 To 10
Arvot(i) = CStr(CInt(Rnd * 9) + 1) 'arvo väliltä 1-10
Next i
msg = Join(Arvot, ", ")
Do
Siirto = False
For i = 0 To 9
If CInt(Arvot(i)) > CInt(Arvot(i + 1)) Then
abu = Arvot(i)
Arvot(i) = Arvot(i + 1)
Arvot(i + 1) = abu
Siirto = True
End If
Next i
Loop While Siirto
MsgBox msg & vbCrLf & Join(Arvot, ", ")Tuon numerojärjestyksen minä oon tehny näin
Dim i as long Dim j as long Dim m as long Dim arvotut(1 to 7) as long Dim arvotut2(1 to 7) as long m = 1 For j = 1 to 39 For i = 1 to 7 If arvotut(i) = j Then arvotut2(m) = j m = m + 1 End If Next Next
Aihe on jo aika vanha, joten et voi enää vastata siihen.