# zufalls generator



## Sliver (19. August 2002)

Grüße,
wie kann ich nen zufalls generator mit namen bzw. wörtern machen?
mit zahlen ist das ja kein problem.


danke im vorraus


sers
sliver


----------



## Dario Linsky (19. August 2002)

ebenfalls mit zahlen. ein computer kennt nichts anderes als zahlen, selbst die buchstaben sind durch die ascii-codierung nichts anderes als zahlen.
eine quick-and-dirty-methode wäre, dass du einfach eine reihe von zufallszahlen zwischen 65 (A) und 90 (Z) oder zwischen 97 (a) und 122 (z) erzeugst. die kannst du dann mit der chr-funktion in buchstaben umwandeln und zu einem string verbinden.
das problem dabei ist einfach, dass ein computer an sich strunzdumm ist, und dabei mit ziemlicher wahrscheinlichkeit kein sinnvolles word rauskommen wird. also muss der computer erstmal wissen, was ein gültiges wort ist.

du musst also zuerst dem computer erklären, wie ein gültiges wort aussieht. das kannst du unter anderem über einen vorgegebenen wortbestand machen (ziemlich statisch) oder du programmierst einen algorithmus, der das muster eines gültigen wortes anhand von regulären ausdrücken festlegt (ziemlich viel arbeit, aber interessant -> künstliche intelligenz).


----------



## Sliver (19. August 2002)

ähm sorry da hab ich mich wohl falsch ausgedrückt...

also ich meinte das so:

klick auf button -> eines von 10 wörtern wird aus gesucht und angezeigt

die 10 wörter habe ich irgendwo in den programm code ein gesetzt... ich wollte nicht das das programm "eigene" wörter erstellt.


----------



## Dario Linsky (19. August 2002)

na wenn das nur um 10 wörter geht, dann programmier das doch statisch im code ein. leg einfach ein array vom typ string an, in das du alle wörter reinschreibst. ein zufallswort kriegst du dann raus, indem du einen zufälligen index ein element aus dem array holst:


```
Private Sub Zufallswort(n As Integer)

Dim strWörter(1 To 10) As String
strWörter(1) = "blablub"
strWörter(2) = "Wort 2"
strWörter(3) = "und so weiter"
'und so weiter bis Wörter(10)

MsgBox Wörter(n)

End Sub
```

n ist dabei eine zufallszahl zwischen 1 und 10. dadurch wird ein zufälliges element aus der aufzählung der einzelnen wörter aus dem array gesucht. 

edit: natürlich ist es absoluter schwachsinn, das array immer erst dann zu erzeugen, wenn ein wort daraus gesucht werden soll. das dient hier nur für das beispiel. das array deklarierst du dann global und füllst es beim Form_Load mit strings.


----------



## Sliver (19. August 2002)

Sorry wo muss ich das einsetzen?
Also ich hab jetzt nen Button und wenn man auf den klickt soll in Label1 eines der wörter angezeigt werden...


----------



## Dario Linsky (19. August 2002)

```
Option Explicit
Private Wörter(1 To 10) As String

Private Sub Form_Load()
'Array mit Wörtern laden:
Wörter(1) = "blablub"
Wörter(2) = "..."
Wörter(3) = "und so weiter"
' ...
Wörter(10) = "letztes element"
End Sub

Private Sub Command1_Click()
'Zufallszahl berechnen halt ...
Label1.Caption = Wörter(n) 'n = berechnete zufallszahl
End Sub
```


----------



## Sliver (19. August 2002)

also so siehts bei mir jetzt aus:


```
Option Explicit
Private Wörter(1 To 10) As String

Private Sub Command2_Click()
    End
End Sub

Private Sub Form_Load()
    'Array mit Wörtern laden:
    Wörter(1) = "wort 1"
    Wörter(2) = "wort 2"
    Wörter(3) = "wort 3"
    Wörter(4) = "wort 4"
    Wörter(5) = "wort 5"
    Wörter(6) = "wort 6"
    Wörter(7) = "wort 7"
    Wörter(8) = "wort 8"
    Wörter(9) = "wort 9"
    Wörter(10) = "wort 10"
End Sub

Private Sub Command1_Click()
    Label1.Caption = Wörter(n) 'n = berechnete zufallszahl
End Sub
```

aber es kommt immer beim klick auf den button zu folgender fehlermeldung:
"Fehler beim Kompilieren: Variable nicht definiert"
und das "n" bei "Label1.Caption = Wörter(*n*) 'n = berechnete zufallszahl" wird makiert.
sollte er nicht durch zufall dort eine zahl aussuchen?


----------



## Dario Linsky (19. August 2002)

:denken:  (c) by kapro 2002


das "option explicit" bedeutet, dass du alle variablen erst definieren musst, bevor du sie benutzen kannst, sonst meckert der compiler. damit verhindert man tippfehler.
und ausserdem musst du die zufallszahl erst noch selber erzeugen (mit Rnd()). zufallszahlen fallen nicht vom himmel...


----------



## Sliver (19. August 2002)

Ist so richtig?


```
Option Explicit
Private Wörter(0 To 10) As String

Private Sub Command2_Click()
    End
End Sub

Private Sub Form_Load()
    Randomize
    'Array mit Wörtern laden:
    Wörter(0) = "wort 0"
    Wörter(1) = "wort 1"
    Wörter(2) = "wort 2"
    Wörter(3) = "wort 3"
    Wörter(4) = "wort 4"
    Wörter(5) = "wort 5"
    Wörter(6) = "wort 6"
    Wörter(7) = "wort 7"
    Wörter(8) = "wort 8"
    Wörter(9) = "wort 9"
    Wörter(10) = "wort 10"
End Sub

Private Sub Command1_Click()
    Label1.Caption = Wörter(Rnd * 10) 'n = berechnete zufallszahl
End Sub
```

Hatte zuvor nen paar Fehlermeldungen die sind aber nach dem einfügen von "Randomize" im Form_Load und von "Wörter 0..." verschwunden.


----------



## Dario Linsky (19. August 2002)

ich hab das mal so gelöst:


```
Option Explicit

Private Wörter(1 To 10) As String

Private Function Zufallswort(n As Integer) As String
If n < 1 Then
    n = 1
End If
If n > 10 Then
    n = 10
End If
Zufallswort = Wörter(n)
End Function

Private Sub Command1_Click()
Dim n As Integer
Randomize
n = Fix(Rnd(10) * 10)
Label1.Caption = Zufallswort(n)
End Sub

Private Sub Form_Load()
    'Array mit Wörtern laden:
    Wörter(1) = "wort 1"
    Wörter(2) = "wort 2"
    Wörter(3) = "wort 3"
    Wörter(4) = "wort 4"
    Wörter(5) = "wort 5"
    Wörter(6) = "wort 6"
    Wörter(7) = "wort 7"
    Wörter(8) = "wort 8"
    Wörter(9) = "wort 9"
    Wörter(10) = "wort 10"
End Sub
```

deins ist auf den ersten blick zwar nicht unbedingt falsch, aber teilweise etwas unsauber. die rnd()-funktion liefert einen wert vom typ single zurück. den musst du erst abfangen und als integer benutzen. der index in einem array ist immer eine ganzzahl.
ausserdem solltest du abfangen, ob evtl. werte ausserhalb des arrays zustandekommen (und das kommt dabei vor).


----------



## Sliver (19. August 2002)

Hab oben noch editiert und es richtig gestellt.
Ist viel einfacher. 

*asphyxia: *
ich hab's trotzdem gesehen, und deswegen sagt meine antwort teilweise
etwas, was gar nicht unbedingt 100 prozentig zu deiner frage passt.


----------



## Sliver (19. August 2002)

Wusste garnet das du Mod bist... aber kein Wunder bei dem Wissen. 

Noch was anderes: Ist es möglich die einzelnen "Treffer" zählen zu lassen? Also das er in nem anderen Label anzeigt wie oft wort 1 gezeigt wurde und in einem anderen Label wie oft wort 2 angezeigt wurde usw... geht das? Wenn ja... wie? 

*edit*
Ach ich bin doof... steht doch in meinem Büchlein... muss nur etwas erweitern. *slap*


----------



## Dario Linsky (19. August 2002)

klar, mit ein paar variablen ist das auch möglich. einfach für jede mögliche zufallszahl (also 10 stück) eine variable anlegen, und die dann bei jedem entsprechenden treffer um eins erhöhen.
geht aber auch eleganter mit einem zweiten array, weil dann der index der gleiche ist. 


```
Private Zähler(1 To 10) As Integer

Private Function Zufallswort(n As Integer) As String
'...
Zähler(n) = Zähler(n) + 1
End Function
```


----------



## Sliver (20. August 2002)

Hm? Deinen Code verstehe ich jetzt nicht ganz...

Also ich hab das so geregelt:


```
Private Sub Command1_Click()
    Label1.Caption = Wörter(Rnd * 10) 'n = berechnete zufallszahl
    If (Label1.Caption = "Men in Black II") Then
        Gewinne = Gewinne + 1
        lblGewinne.Caption = "MiB 2: " & Gewinne
    End If
    If (Label1.Caption = "Ali") Then
        Gewinne1 = Gewinne1 + 1
        lbl1Gewinne.Caption = "Ali: " & Gewinne1
    End If
    If (Label1.Caption = "Party Animals") Then
        Gewinne2 = Gewinne2 + 1
        lbl2Gewinne.Caption = "P.A.: " & Gewinne2
    End If
    If (Label1.Caption = "Scooby-Doo") Then
        Gewinne3 = Gewinne3 + 1
        lbl3Gewinne.Caption = "S.D.: " & Gewinne3
    End If
    If (Label1.Caption = "Der Anschlag") Then
        Gewinne4 = Gewinne4 + 1
        lbl4Gewinne.Caption = "D.A.: " & Gewinne4
    End If
    If (Label1.Caption = "Arac Attack") Then
        Gewinne5 = Gewinne5 + 1
        lbl5Gewinne.Caption = "A.A.: " & Gewinne5
    End If
    If (Label1.Caption = "Mr. Deeds") Then
        Gewinne6 = Gewinne6 + 1
        lbl6Gewinne.Caption = "Mr. D.: " & Gewinne6
    End If
End Sub
```

Und ich hab ein Standardmodul hinzugefügt mit "Public Gewinne1-6".


----------



## Dario Linsky (20. August 2002)

klar, so kann man das natürlich auch regeln, aber das wär mir ehrlich gesagt zu viel tipparbeit. das geht nämlich viel kürzer. 


```
Option Explicit

Private Wörter(1 To 10) As String
Private Gewinne(1 To 10) As Integer
Private Preise(1 To 6) As String

Private Sub Form_Load()
Wörter(1) = "Wort 1"
' und so weiter...
End Sub

Private Function Zufallswort(n As Integer) As String
Zufallswort = Wörter(n)
If n <= 6 Then
    Gewinne(n) = Gewinne(n) + 1
    Label2.Caption = Wörter(n) & ": " & Preise(n)
End If
End Function

Private Sub Command1_Click()
Dim n As Integer
Randomize
n = Fix(Rnd(10) * 10)
Label1.Caption = Zufallswort(n)
End Sub
```

ein array enthält doch schon mehrere variablen, die du einfach über den index ansprechen kannst.


----------



## Sliver (21. August 2002)

Kannst du mir nochmal helfen?
Also ich wollte jetzt etwas erweitern und zwar 2 Dinge:

1. Das man über eine TextBox eingeben kann welche Begriffe für "wort 1", "wort 2" usw. eingefügt werden. Also beim Button (im Code) solls eingefügt werden und beim dazu passenden Label.

2. Man soll in einer TextBox (oder was geht) eigeben können wie oft das Programm automatisch den klick auf den "Start"-Button wiederholen soll. Wenn man in der TextBox "0" drin stehen hat soll es keine wirkung zeigen.


Danke nochmals im vorraus.


----------



## Dario Linsky (25. August 2002)

die erste von den beiden fragen versteh ich irgendwie nicht. 
aber das zweite kannst du beispielsweise mit einem timer lösen. nimm dir einfach ein timer-objekt und zwei textboxen auf das formular. das intervall von dem timer stellst du auf 1000 und in die beiden textboxen schreibst du jeweils eine zahl. der code sieht dann so aus:

```
Private Sub Timer1_Timer()
If CInt(Text2.Text) > 1 Then
    Text1.Text = CStr(CInt(Text1.Text) + 1)
    Text2.Text = CStr(CInt(Text2.Text) - 1)
End If
End Sub
```
ist aber nur ein beispiel.


----------



## Sliver (27. August 2002)

Wo geht denn da nen Befehl zum Button?

Achja ich meinte dsa so: Der User soll ein stellen können wie oft auf den Button geklickt werden soll. (User macht einen klick -> Programm macht so viele klicks wie es in den TextBoxen steht)


----------



## Dario Linsky (27. August 2002)

> die erste von den beiden fragen versteh ich irgendwie nicht.
> aber das zweite kannst du beispielsweise mit einem timer lösen. nimm dir einfach ein timer-objekt und zwei textboxen auf das formular. das intervall von dem timer stellst du auf 1000 und in die beiden textboxen schreibst du jeweils eine zahl. der code sieht dann so aus:
> 
> ```
> ...



+

:denken:

=


```
Private Sub Command1_Click()
If CInt(Text1.Text) > 0 Then
    Timer1.Enabled = True
End If
End Sub

Private Sub Timer1_Timer()
If CInt(Text1.Text) > 1 Then
    Text1.Text = CStr(CInt(Text1.Text) + 1)
    Text2.Text = CStr(CInt(Text2.Text) - 1)
Else
    Timer1.Enabled = False
End If
End Sub
```

mit dem button aktivierst du den timer und der läuft so lange bis der wert aus der textbox auf 0 runtergezählt wurde. danach deaktiviert er sich selber.


----------



## MiRCOSiCKO (7. November 2003)

Wie setze ich das ganze in eine Textbox?
Sprich in eine Webseiten Textbox

Wie man ein einzelles Wort per CommandButton rein setzt weis, aber nicht die Zufallswörter, kann mir jemand helfen?


----------



## Sliver (9. November 2003)

Datum


----------

