Ich möchte 8 Schaltflächen mit den Zahlen 1 - 8 zufällig belegen. Wie kann man das einfach in VBA „mischen“?
Habs noch nicht kapiert wie das so laufen soll.
ich würde einfach Zufallszahlen erstellen und immer schauen ob eine davon schon vergeben wurde (1-8) und dann solange suchen bis eine da ist die noch nicht vorkommt. aber das ist glaub ich nicht das gelbe vom Ei
Die Werte einfach in Variablen „E1“ - „E8“ legen, den Rest kümmer ich mich
Ich möchte 8 Schaltflächen mit den Zahlen 1 - 8 zufällig
belegen. Wie kann man das einfach in VBA „mischen“?
Habs noch nicht kapiert wie das so laufen soll.
Ich würde einfach Zufallszahlen erstellen und immer schauen ob
eine davon schon vergeben wurde (1-8) und dann solange suchen
bis eine da ist die noch nicht vorkommt. aber das ist glaub
ich nicht das gelbe vom Ei
richtig. Die gezogenen Zahlen kommen ja zufällig, als schlimmster Fall könnte es passieren, daß nur noch Zahlen gezogen werden, die schon da waren, dann hättest Du eine Endlosschleife.
Besser ist echtes Mischen, da hast Du es in der Hand, wie lang das dauert.
Die Werte einfach in Variablen „E1“ - „E8“ legen, den Rest
kümmer ich mich
Das ist zwar schon mal eine schlechte Idee, aber damit Du es siehst …
Dim E1 As Integer
Dim E2 As Integer
Dim E3 As Integer
Dim E4 As Integer
Dim E5 As Integer
Dim E6 As Integer
Dim E7 As Integer
Dim E8 As Integer
Dim R(7) As Integer, i As Integer, n As Long
Dim Z1 As Integer, Z2 As Integer, Tmp As Integer
Randomize Timer
'Vorbereitung
For i = 0 To 7
R(i) = i + 1
Next
'Mischen
For n = 0 To 10000 '
Gruß Rainer
meine Lösung wird zwar nicht besser sein, aber da ich mir die Mühe parallel zu dir gemacht habe, stelle ich sie jetzt trodem noch kruz vor:
Randomize
Dim tmp\_random, i1, i2, i3, i4, E(0 To 7) As Integer
Dim frei(0 To 7) As Boolean
'Vorbereitung
For i1 = 0 To 7
frei(i1) = True
Next
For i2 = 0 To 7
tmp\_random = Int((8 - i2) \* Rnd) 'mögliche Zahlen werden pro Runde eine weniger
i3 = 0
i4 = 0
For i3 = 0 To tmp\_random Step 0 'Diese Schleife sucht die tmp\_radom. freie Zahl
If frei(i4) Then i3 = i3 + 1
i4 = i4 + 1
Next
frei(i4 - 1) = False 'Die ausgewählte Zahl ist nicht mehr frei
E(i2) = i4
Next
Ja gut, sie ist etwas länger, hat aber den gewünschten Effekt ! Ist jetzt nur eben E(0) bis E(7), siehe Rainer!
das hat mir doch jetzt keine Ruhe gelassen, ‚einen hab‘ ich noch …’
Dim r(7) As Integer, i As Integer, z As Integer
Dim e(7) As Integer, tmp As Integer
Randomize Timer
For i = 0 To 7
r(i) = i + 1
Next
For i = 7 To 0 Step -1
z = Int(Rnd(1) \* (i + 1))
e(i) = r(z)
tmp = r(z)
r(z) = r(i)
r(i) = tmp
Me.Print e(i)
Next
Ich möchte 8 Schaltflächen mit den Zahlen 1 - 8 zufällig
belegen. Wie kann man das einfach in VBA „mischen“?
Die Werte einfach in Variablen „E1“ - „E8“ legen, den Rest
kümmer ich mich
Hi Tobias,
die Codes waren mir alle zu schwierig, 5-7 Variablen für 8 Buttons, ich hab die variablen minimiert
Mein VB5.0 kennt kein Replace.
Option Explicit
'
Private Sub Form\_Load()
Dim Z As String, N As Long
Z = "12345678"
Randomize Timer
For N = 8 To 1 Step -1
Me.Controls(N - 1).Caption = Mid(Z, Int(Rnd() \* N) + 1, 1)
Z = Replace(Z, Me.Controls(N - 1).Caption, "")
Next N
End Sub
'
Private Sub Form\_Load()
Dim Z As String
Z = "12345678"
Randomize Timer
While Len(Z)
Me.Controls(8 - Len(Z)).Caption = Mid(Z, Int(Rnd() \* Len(Z)) + 1, 1)
Z = Replace(Z, Me.Controls(8 - Len(Z)).Caption, "")
Wend
End Sub
'
Function Replace(ByVal Wort, ByVal Weg, ByVal Ersatz) As String
Replace = Left(Wort, InStr(Wort, Weg) - 1) & Ersatz & Mid(Wort, InStr(Wort, Weg) + Len(Weg))
End Function
die Codes waren mir alle zu schwierig, 5-7 Variablen für 8
Buttons, ich hab die variablen minimiert
zu viele Variablen? Auf was man alles achten soll … *gg*
Dim r(7) As Integer, i As Integer, tmp As Integer, z As Integer
Randomize Timer
For i = 0 To 7
r(i) = i + 1
Next
For i = 7 To 0 Step -1
z = Int(Rnd(1) \* (i + 1))
tmp = r(z)
r(z) = r(i)
r(i) = tmp
Next
Noch weiter lässt sich das jetzt aber nicht mehr optimieren.
(Stringmanipulationen sind langsam.)
*gg* mehr davon! So eine Suche nach dem optimalen Code macht
Spaß!
Da hast du echt Recht! (Daaa, haste mehr davon! )
Kann mal bitte jemand eine neue Aufgabe dieser Art stellen, aber etwas simples bitte, damit ich es auch verstehe! xD
Da hast du echt Recht! (Daaa, haste mehr davon! )
Kann mal bitte jemand eine neue Aufgabe dieser Art stellen,
aber etwas simples bitte, damit ich es auch verstehe! xD
he, das war umgekehrt gemeint! … :->>
OK, dann eben etwas, das ich schon fertig habe.
Schreib mal einen Code, der feststellt, wie viele Kombinationen von Lottotipps es gibt, die zwei aufeinander folgende Zahlen enthalten.
Also so etwas z.B.: 9, 11, 23, 24 , 32, 45
Mit möglichst wenig Code und schnell.
Aber nicht vom Ergebnis überrascht sein, es sind viele!
Tipp: Rekursion.
Da hast du echt Recht! (Daaa, haste mehr davon! )
Kann mal bitte jemand eine neue Aufgabe dieser Art stellen,
aber etwas simples bitte, damit ich es auch verstehe! xD
he, das war umgekehrt gemeint! … :->>
Achso, auch gut! xDDDD
OK, dann eben etwas, das ich schon fertig habe.
Schreib mal einen Code, der feststellt, wie viele
Kombinationen von Lottotipps es gibt, die zwei aufeinander
folgende Zahlen enthalten.
Also so etwas z.B.: 9, 11, 23, 24 , 32, 45
Ein schöön sinnloses Rätsel. Da beim Lotto die Reihenfolge von Bedeutung ist, zählt z. B. „9, 23 , 11, 24 , 32, 45“ nicht?
Ich werde morgen mal etwas entwerfen, habe jetzt nicht viel Zeit und bisher fällt mir nur die Möglichkeit ein, jede Kombination zu prüfen:smile:)
Wikipedia half mir aber schonmal deinen Tipp „Rekursion“ zu übersetzen .
Public Sub Mische()
Dim E(7) As Integer
Dim I As Long, R As Long
Randomize Second(Now)
For I = 0 To 7
E(I) = -1
Next
For I = 0 To 7
R = Rnd() \* 7
While E(R) \> -1
R = (R + 7) Mod 8
Wend
E(R) = I
Next
End Sub
Aber nicht vom Ergebnis überrascht sein, es sind viele!
Tipp: Rekursion.
Hallo Rainer,
weißt du wovon das genau abhängt wieviele rekursive Aufrufe erlaubt isnd?
An dem BS, an der Software?
Ich weiß nicht mehr genau ob es Bubblesort war oder Quicksort, zumindest eins davon hat sich wegen Stapelüberlauf aufgehängt.
Und soweit ich noch weiß waren da ca. 85000 Dateinamen zu sortieren.
Ich mußte gezwungenermaßen dann das langsame „normale“ Sortieren nehmen.
Deshalb meine Frage, wie groß ist dieser „Stapel“ und wovon hängt die Größe ab? also wieviele Aufrufe einer gleichen Prozedur sind zulässig. Ist der bei VB6 größer als bei VB5 oder ist er bei Win-Vista größer als bei Win-XP?
PS: Und da ich morgen schon sehr gerne schau ob ich da Code basteln kann der schneller ist *gg* meinst du mit Lotto 6 Zahlen aus 49 oder spielt da die Supersex und die Zusatzzahl auch noch ne Rolle bei aufeinanderfolgenden Zahlen?
weißt du wovon das genau abhängt wieviele rekursive Aufrufe
erlaubt isnd?
nein, weiß ich nicht.
An dem BS, an der Software?
Nein, weiß ich nicht.
Ich weiß nicht mehr genau ob es Bubblesort war oder Quicksort,
zumindest eins davon hat sich wegen Stapelüberlauf aufgehängt.
Und soweit ich noch weiß waren da ca. 85000 Dateinamen zu
sortieren.
Das Problem gibt es hier ja nicht. Richtig geschrieben kann der Stack nicht überlaufen.
Ich mußte gezwungenermaßen dann das langsame „normale“
Sortieren nehmen.
Deshalb meine Frage, wie groß ist dieser „Stapel“ und wovon
hängt die Größe ab? also wieviele Aufrufe einer gleichen
Prozedur sind zulässig.
Ich denke die Begrenzung ist die Größe des dafür reservierten Speichers. Bei einem ByteArray dürfen es wohl doppelt so viele sein, wie bei Integer. Aber wer das verwaltet, BS, Hardware … ? Keine Ahnung. Aber soll der Stack nicht schneller sein als der normale RAM? Früher war das mal so. Auf dem C64 lag der Stack im zweistelligen, schnelleren Bereich des Speichers.
Ist der bei VB6 größer als bei VB5
oder ist er bei Win-Vista größer als bei Win-XP?
Nein, keine Ahnung.
PS: Und da ich morgen schon sehr gerne schau ob ich da Code
basteln kann der schneller ist *gg* meinst du mit Lotto 6
Zahlen aus 49 oder spielt da die Supersex und die Zusatzzahl
auch noch ne Rolle bei aufeinanderfolgenden Zahlen?
Nein, die spielen keine Rolle, es geht ja um mögliche Tipps, nicht um Ziehungen. Also nur 6 aus 49, Ziehungen kommen nicht vor, also auch keine Zusatzzahl, das wäre ein anderes Thema.
PS: Und da ich morgen schon sehr gerne schau ob ich da Code
basteln kann der schneller ist *gg* meinst du mit Lotto 6
Zahlen aus
ich hatte da einen Denkfehler, mit einem ganz simplen Code geht das auch, der andere Weg sieht nür hübscher aus und ist etwas weniger Code.
Dumm, daß der hübsche Code langsamer ist.
ich hatte da einen Denkfehler, mit einem ganz simplen Code
geht das auch, der andere Weg sieht nür hübscher aus und ist
etwas weniger Code.
Dumm, daß der hübsche Code langsamer ist.
Fällt Dir nicht etwas richtig Schönes ein?
Hallo Rainer,
bisher nicht, ich kam erst mal nur auf folgenden nicht so hübschen Code, der liefert für 6 aus 49
13.963.816 Gesamtkombinationen
3.246.243 Kombination mit mindest einmal den Fall daß zwei Zahlen aufeinanderfallen
Zeit: 7,5 Sekunden
Option Explicit
'
Private Sub Form\_Load()
End Sub
'
Private Sub Command1\_Click()
Dim a As Byte, b As Byte, c As Byte, d As Byte, e As Byte, f As Byte
Dim n As Long, nn As Long
Static T As Double
T = Timer
For a = 1 To 44
For b = a + 1 To 45
For c = b + 1 To 46
For d = c + 1 To 47
For e = d + 1 To 48
For f = e + 1 To 49
'MsgBox a & " " & b & " " & c & " " & d & " " & e & " " & f
If a + 1 = b Or b + 1 = c Then nn = nn + 1
n = n + 1
Next f
Next e
Next d
Next c
Next b
Next a
Text1 = n
Text2 = nn
Text3 = Timer - T
End Sub