merkwürdiges Phänomen bei Zufallszahlen

Hallo Experten,

sitze vor einem kleinen Rätsel, vielleicht kann mir ja einer helfen.

In ein Formular werden 8 Zahlen eingegeben, und zwar in einer anderen Reihenfolge, als sie hinterher als Lösungszahl herauskommen soll. Diese Zahlen (jeweils eine in einem Labelfeld) sollen nun durch Klick auf den Button „cmdSortieren“ durch Zufallszahlen sortiert werden.

Steht eine Zahl an der richtigen Stelle, soll sie stehenbleiben und nicht durch erneutes Klicken auf den Button durch eine neue Zufallszahl ersetzt werden.

Das merkwürdige daran ist jetzt nur, durch die If-Abfrage steht sofort nach dem ersten bzw. zweiten Klick die richtige Reihenfolge da. Das sollte eigentlich nicht so sein, denn ohne die If-Abfrage dauert es wesentlich länger, bis mal in einem Labelfeld die richtige Zahl steht. Nur die Abfrage wird benötigt, damit richtige Zahlen auch stehen bleiben und nicht mehr verändert werden.

Das ganze soll ein Geduldsspiel sein, also nicht wundern, wessen Nerven ich damit strapazieren möchte, da es länger dauern soll.

Hat jemand eine Idee?

Hier noch der Code:

Private Sub cmdSortieren\_Click()

'Lösungszahlen
Const lzahl1 = 8
Const lzahl2 = 4
Const lzahl3 = 2
Const lzahl4 = 6
Const lzahl5 = 9
Const lzahl6 = 0
Const lzahl7 = 1
Const lzahl8 = 3

'Variable für Zufallszahlen
Dim zahl1 As Single
Dim zahl2 As Single
Dim zahl3 As Single
Dim zahl4 As Single
Dim zahl5 As Single
Dim zahl6 As Single
Dim zahl7 As Single
Dim zahl8 As Single

Randomize Timer

For i = 1 To 20
 If CDbl(lbl\_lz1) lzahl1 Then
 zahl1 = Int(10 \* Rnd) 
 lbl\_lz1 = zahl1 
 End If
 If CDbl(lbl\_lz2) lzahl2 Then
 zahl2 = Int(10 \* Rnd)
 lbl\_lz2 = zahl2
 End If
 If CDbl(lbl\_lz3) lzahl3 Then
 zahl3 = Int(10 \* Rnd)
 lbl\_lz3 = zahl3
 End If
 If CDbl(lbl\_lz4) lzahl4 Then
 zahl4 = Int(10 \* Rnd)
 lbl\_lz4 = zahl4
 End If
 If CDbl(lbl\_lz5) lzahl5 Then
 zahl5 = Int(10 \* Rnd)
 lbl\_lz5 = zahl5
 End If
 If CDbl(lbl\_lz6) lzahl6 Then
 zahl6 = Int(10 \* Rnd)
 lbl\_lz6 = zahl6
 End If
 If CDbl(lbl\_lz7) lzahl7 Then
 zahl7 = Int(10 \* Rnd)
 lbl\_lz7 = zahl7
 End If
 If CDbl(lbl\_lz8) lzahl8 Then
 zahl8 = Int(10 \* Rnd)
 lbl\_lz8 = zahl8
 End If
 Verzoegerung (0.01 \* i)
Next i

End Sub

Sub Verzoegerung(VTime As Single)

 Dim StartZeit As Double
 Dim EndeZeit As Double
 DoEvents
 StartZeit = Timer
 EndeZeit = Timer
 Do While (EndeZeit - StartZeit) 

Danke schonmal, 
Kerstin

Hallo Kerstin,

zuerst einmal: bin kein Experte :wink:

Mir ist nach lesen deiner Beschreibung nicht ganz klar geworden, worum es eigentlich geht. (Man weiß die 8 Zahlen, setzt die ein, wenn man richtig geraten hat, bleibt die Zahl an der Stelle stehn, wenn nicht wird sie durch eine Zufallszahl ersetzt?)

Also bitte eine genauere Erklärung :smile:

Sollte ich in meinem Weg richtig liegen, hilft vielleicht, die Schleife (wofür is die eigentlich gut???) von „i =1 to 20“ auf „i =1 to 1“ zu setzen (=deaktivieren).

lg, Christian

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi Kerstin,
warum sollte es auch wesentlich öfter als 2 x Buttondrücken dauern, bis alle Zahlen korrekt erraten wurden. Du hast doch eine for-next-Schleife mit 20 Durchläufen eingebaut.

Gruß.Timo

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

#21 v. excelfunktionen.de kann viell. als weitere Inspiration nützlich sein.

Oliver

Hallo Timo,

jetzt wo ich Deinen Kommentar lese, fällt es mir fast wie Schuppen von den Augen. Logo, es werden ja in jedem Durchgang 20 Zahlen gezogen, und sobald die richtige Zahl da steht, wird sie nicht mehr verändert. Dann ist es wirklich kein Wunder.

Entweder muß ich die Schleife rauslassen (die aber für einen schönen Effekt sorgt, daß nämlich in den Labelfeldern verschiedene Zahlen durchlaufen) oder irgendwie noch einen Zähler einbauen, mit dem ich festlege, nach wie vielen klicks die richtigen Zahlen gezogen werden, aber da finde ich schon was passendes.

Danke an alle,

Kerstin

Hi Kerstin,
warum sollte es auch wesentlich öfter als 2 x Buttondrücken
dauern, bis alle Zahlen korrekt erraten wurden. Du hast doch
eine for-next-Schleife mit 20 Durchläufen eingebaut.

Gruß.Timo

Hallo Christian,

Sollte ich in meinem Weg richtig liegen, hilft vielleicht, die
Schleife (wofür is die eigentlich gut???) von „i =1 to 20“ auf
„i =1 to 1“ zu setzen (=deaktivieren).

Die Schleife sorgt für einen schönen Effekt, daß in den Labelfeldern verschiedene Zahlen durchlaufen, wie bei einem „einarmigen Banditen“.

Aber ich habe (vermutlich) eine Lösung gefunden, die werde ich jetzt mal versuchen, umzusetzen.

Grüße,
Kerstin

so soll’s laufen!
Hallo an alle,

hab’s hinbekommen :smile:

Kerstin

PS: für alle, die es interessiert, hier noch der Code dazu:

For i = 1 To 20
 If z1neu = True Then
 zahl1 = Int(10 \* Rnd)
 lbl\_lz1 = zahl1
 End If
 If z2neu = True Then
 zahl2 = Int(10 \* Rnd)
 lbl\_lz2 = zahl2
 End If
 If z3neu = True Then
 zahl3 = Int(10 \* Rnd)
 lbl\_lz3 = zahl3
 End If
 If z4neu = True Then
 zahl4 = Int(10 \* Rnd)
 lbl\_lz4 = zahl4
 End If
 If z5neu = True Then
 zahl5 = Int(10 \* Rnd)
 lbl\_lz5 = zahl5
 End If
 If z6neu = True Then
 zahl6 = Int(10 \* Rnd)
 lbl\_lz6 = zahl6
 End If
 If z7neu = True Then
 zahl7 = Int(10 \* Rnd)
 lbl\_lz7 = zahl7
 End If
 If z8neu = True Then
 zahl8 = Int(10 \* Rnd)
 lbl\_lz8 = zahl8
 End If
 Verzoegerung (0.01 \* i)
Next i

If lbl\_lz1 = lzahl1 Then
 z1neu = False
End If
If lbl\_lz2 = lzahl2 Then
 z2neu = False
End If
If lbl\_lz3 = lzahl3 Then
 z3neu = False
End If
If lbl\_lz4 = lzahl4 Then
 z4neu = False
End If
If lbl\_lz5 = lzahl5 Then
 z5neu = False
End If
If lbl\_lz6 = lzahl6 Then
 z6neu = False
End If
If lbl\_lz7 = lzahl7 Then
 z7neu = False
End If
If lbl\_lz8 = lzahl8 Then
 z8neu = False
End If

Hallo Kerstin,
ich habe mich aus dem Thread herasugehalten weil ich nicht wusste was du eigentlich möchtest, aber wenn ich so nen Code sehe muss ich was sagen:
For i = 1 To 20

If z1neu = True Then
zahl1 = Int(10 * Rnd)
lbl_lz1 = zahl1
End If

Verzoegerung (0.01 * i)
Next i

K.A. welche Sub hinter "verzoegerung steckt, aber folgender Code macht das Gleiche:

For i = 1 To 20
 If z1neu = True Then lbl\_lz1= Int(10 \* Rnd) 


> ...  
> Verzoegerung (0.01 \* i)  
> Next i

wobei ich das mit einem Array gelöst hätte, also nicht z1neu, z2neu usw sondern z() z(2) usw

If lbl_lz2 = lzahl2 Then
z2neu = False
End If

kann man kürzen zu If lbl_lz2 = lzahl2 Then z2neu = False

Wenn du magst poste hier mal den Gesamtcode, ich dezimiere ihn, und wenn ich diesen Code hier sehe, gewaltig.
Gruß
Reinhard

Hallo Reinhard,

K.A. welche Sub hinter "verzoegerung steckt, aber folgender
Code macht das Gleiche:

For i = 1 To 20
If z1neu = True Then lbl_lz1= Int(10 * Rnd)


Verzoegerung (0.01 * i)
Next i

Hast recht, die Variable zahl1 brauch ich nicht. Die Verzögerung sorgt dafür, daß die Zahlen, die während der Schleife gezogen werden, eine zeitlang sichtbar am Bildschirm stehen bleiben, bevor die nächsten Zahlen erzeugt werden (kleine Spielerei).

wobei ich das mit einem Array gelöst hätte, also nicht z1neu,
z2neu usw sondern z() z(2) usw

Was sind Arrays? Damit kenn ich mich nicht aus.

If lbl_lz2 = lzahl2 Then
z2neu = False
End If

kann man kürzen zu If lbl_lz2 = lzahl2 Then z2neu = False

Was anderes hab ich doch auch nicht geschrieben, oder?

Wenn du magst poste hier mal den Gesamtcode, ich dezimiere
ihn, und wenn ich diesen Code hier sehe, gewaltig.

Eigentlich nicht nötig, die ganze Tabelle ist ein kleines Spiel für eine Hochzeitsfeier, läuft jetzt wie gewünscht und wird danach vermutlich nie wieder gebraucht. Aber trotzdem Danke für das Angebot.

Gruß
Reinhard

Grüße zurück,
Kerstin