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) Next
heh, 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.