Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6: [vb6] Random sana

Sivun loppuun

Kulma [06.06.2006 15:51:10]

#

Miten saisin että ohjelma lisää textboxiin randomisti "sanan"?
"Sana" meinaa kaikkea mahdollista tekstiä minkä voi kirjoittaa näppäimistöllä esim "SO<o2q34e9 '¤&[@£/_" tai "mO1 =}20$€".
Haluaisin siis että se kirjoittaa kaikki mahdolliset enintään 20 merkkiä pitkät "sanat" textboxiin eri riveille.

Esimerkki:

Private Sub Ajastin_Timer ()

'Text1.Textiin lisätään rivi ja RandomSana
Text1.Text = Text1.Text & vbCrlF & RandomSana

'Jos kaikki mahdolliset on lisätty niin lopetetaan
If RandomSana.Valmis = True Then
Ajastin.Enabled = False
End If
End Sub

Jossain vain pitäisi määritellä mikä on "RandomSana", mutta mikä/miten?

Antti Laaksonen [06.06.2006 16:19:55]

#

Tarkastellaan kolmen merkin pituisia sanoja, joissa voi olla kolme erilaista merkkiä (A, B ja C):

AAA   BAA   CAA
AAB   BAB   CAB
AAC   BAC   CAC
ABA   BBA   CBA
ABB   BBB   CBB
ABC   BBC   CBC
ACA   BCA   CCA
ACB   BCB   CCB
ACC   BCC   CCC

Tässä näkyy sanojen muodostustapa. Ensimmäisen merkin voi valita kolmella tavalla, samoin toisen ja kolmannen. Yhteensä sanoja on siis 3 * 3 * 3 = 27.

Tässä on yleiskäyttöinen ohjelma, joka luo listan tietyn pituisista sanoista, joissa on tiettyjä merkkejä. Sanan pituuden ja merkistön pystyy valitsemaan ohjelman alussa:

Const MERKIT = "ABC"   ' käytettävät merkit
Const PITUUS = 3       ' sanan pituus

Sub kerros(kohta As Integer, sana As String)
    Dim i As Integer
    If kohta > PITUUS Then
        ' lisätään listalle oikeanpituinen sana
        List1.AddItem sana
    Else
        ' käydään läpi kaikki sallitut merkit
        For i = 1 To Len(MERKIT)
            kerros kohta + 1, sana & Mid(MERKIT, i, 1)
        Next
    End If
End Sub

Private Sub Form_Load()
    Caption = "Sanojen määrä: " & (Len(MERKIT) ^ PITUUS)
    kerros 1, ""
End Sub

Ohjelman toiminta perustuu siihen, että jokainen sanan merkki on vuorollaan yksi sallituista merkeistä. Rekursiivinen aliohjelma valitsee aina yhden merkin ja kutsuu sen jälkeen itseään.

Ohjelma laskee sanojen määrän suoraan kaavalla mp, jossa m on mahdollisten merkkien määrä ja p on sanan pituus. Kun merkistö ja sanan pituus suurentuu, sanojen määrä kasvaa nopeasti. Esim. kahdeksan merkin pituisia sanoja kirjaimista A, B, C, D, E ja F voidaan muodostaa jo 68 = 1679616.

Tässä kyllä sanat muodostetaan järjestyksessä eikä satunnaisesti, mutta moinen tuskin haittaa.

Kulma [06.06.2006 16:35:10]

#

Kiitos! Yritän tosta vääntää jotain, mutta se tilttas kun laitoin niinkuin halusin että kirjoittaa kaikki mahdolliset 20 sanan pituiset "sanat"?

Antti Laaksonen [06.06.2006 16:42:43]

#

Johtuu luultavasti siitä, että sellaisia sanoja on liian paljon. Jos merkkejä on esim. 50 ja sanan pituus 20, sanoja on 5020 = 9536743164062500000000000000000000. Näin monta sanaa ohjelma ei mitenkään pysty muodostamaan eikä näyttämään.

Kulma [06.06.2006 16:45:32]

#

Antti Laaksonen kirjoitti:

Johtuu luultavasti siitä, että sellaisia sanoja on liian paljon. Jos merkkejä on esim. 50 ja sanan pituus 20, sanoja on 5020 = 9536743164062500000000000000000000. Näin monta sanaa ohjelma ei mitenkään pysty muodostamaan eikä näyttämään.

Miten saisin että se tekee tuon ajastimessa? 1 "sana" millisekunnissa niin ei tilttais.

Laitoin siihen alkuun, sillon kun tilttas:

Const MERKIT = "QqWwEeRrTtYyUuIiOoPpÅåAaSsDdFfGgHhJjKkLlÖöÄäZzXxCcVvBbNnMm,;.:-_½!#¤%&/()=?`´§@£$€{[]}\~^¨*'"   ' käytettävät merkit
Const PITUUS = 20       ' sanan pituus

Metabolix [06.06.2006 16:53:09]

#

Tiedätkös, yksi sana millisekuntissa, niin tuolla merkistöllä (92 merkkiä) jo kaikkien kuuden merkin mittaisten sanojen muodostaminen kestää vaatimattomat 19,2 vuotta. Tämä on tietenkin täysin teoreettista, koska 160 gigatavun kovalevylle mahtuu vain 4,7% näistä.

20 merkin sanoilla taasen muodostaminen tuolla vauhdilla kestäisi liki 60000 kvadriljoona vuotta, ja muistia niille tarvittaisiin reilut 10544061 jottatavua (siis 10,5 kvintiljoonaa tavua).

Kulma [06.06.2006 17:19:55]

#

Metabolix kirjoitti:

Tiedätkös, yksi sana millisekuntissa, niin tuolla merkistöllä (92 merkkiä) jo kaikkien kuuden merkin mittaisten sanojen muodostaminen kestää vaatimattomat 19,2 vuotta. Tämä on tietenkin täysin teoreettista, koska 160 gigatavun kovalevylle mahtuu vain 4,7% näistä.

20 merkin sanoilla taasen muodostaminen tuolla vauhdilla kestäisi liki 60000 kvadriljoona vuotta, ja muistia niille tarvittaisiin reilut 10544061 jottatavua (siis 10,5 kvintiljoonaa tavua).

Ai.
Miten saisin sitten niin että se laittais ajastimessa yhden kerrallaan vanhan tilalle.

T.M. [06.06.2006 17:22:25]

#

Mikä järki?

Kulma [06.06.2006 17:22:57]

#

T.M. kirjoitti:

Mikä järki?

En kerro. =P

kaviaari [06.06.2006 17:23:25]

#

Haluut kovispahistella bustaamalla kaveris salasanan o/

T.M. [06.06.2006 17:26:41]

#

Niijoo... mut on noihin valmiita ohjelmiakin :P

Kulma [06.06.2006 17:35:00]

#

T.M. kirjoitti:

Niijoo... mut on noihin valmiita ohjelmiakin :P

En löytäny.

neau33 [06.06.2006 19:41:11]

#

Kuule kulma!

Leiki tällä:

Private Sub Form_KeyUp(KeyCode As Integer, Shift As Integer)
   Static merkkijono As String, laskuri1 As Integer, laskuri2 As Integer
    Randomize
   If laskuri1 = 0 Then
    laskuri1 = CInt(Rnd(20) * 20)
   End If
   If laskuri2 <= laskuri1 and laskuri1 > 0 Then
    merkkijono = merkkijono + Chr$(CInt(Rnd(KeyCode) * KeyCode))
     laskuri2 = laskuri2 + 1
   ElseIf laskuri2 > laskuri1 Then
    Label1.Caption = Label1.Caption & merkkijono & vbCrLf
     laskuri1 = 0: laskuri2 = 0: merkkijono = ""
   End If
End Sub

Kulma [07.06.2006 10:55:21]

#

Ei tehny mitään ku laitoin form_loadiin.

Metabolix [07.06.2006 13:21:05]

#

No ei varmaankaan, tuohan tekee jotakin painalluseventin KeyCode-muuttujan kanssa.

Sanan saa edellisen tilalle, kun vaihtaa listaan lisäämisen paikalle vaikkapa sijoituslauseen, jossa laittaa sen edellisen tilalle.

Koeta nyt uskoa jo, että ei ole mitään järkeä yrittääkään käydä läpi kaikkia tuollaisia. Katso vaikka tähän mennessä annettuja vuosimääriä ja mieti sitten.

Antti [08.06.2006 15:09:59]

#

Tää juttu alkaa olla tasoa http://thedailywtf.com


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta