Mischen nach Zufall

Hallo,

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 :smile:
Die Werte einfach in Variablen „E1“ - „E8“ legen, den Rest kümmer ich mich :smile:

LG

Hallo,

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 :smile:

richtig. :smile: 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 :smile:

Das ist zwar schon mal eine schlechte Idee, aber damit Du es siehst … :smile:

 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

Hallo,

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 :stuck_out_tongue:! Ist jetzt nur eben E(0) bis E(7), siehe Rainer!

Gruß, Simon

1 Like

Hi Simon,

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:

Du kommst ohne viele Durchläufe aus, Deine Lösung ist schneller, die merke ich mir. Danke!

Gruß Rainer

Hallo Simon,

das hat mir doch jetzt keine Ruhe gelassen, ‚einen hab‘ ich noch …’ :smile:

 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

Gruß Rainer

Hallo 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:

Du kommst ohne viele Durchläufe aus, Deine Lösung ist
schneller, die merke ich mir. Danke!

Uh das ist ja mal echt ist kompliment sowas von dir zu hören, Danke!

Das war allerdings auch mein geheimes Ziel, eine Lösung zu finden, die keine unnötigen Durchläufe macht.

Gruß, Simon

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 :smile:

Hi Tobias,

die Codes waren mir alle zu schwierig, 5-7 Variablen für 8 Buttons, ich hab die variablen minimiert :smile:

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

Gruß
Reinhard

Hallo Reinhard,

die Codes waren mir alle zu schwierig, 5-7 Variablen für 8
Buttons, ich hab die variablen minimiert :smile:

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. :smile:
(Stringmanipulationen sind langsam.)

Gruß Rainer

Hallo,

Noch weiter lässt sich das jetzt aber nicht mehr optimieren.

-)

(Stringmanipulationen sind langsam.)

Ich gebe mich geschlagen… :smile:)

Gruß, Simon

Hallo Simon,

Ich gebe mich geschlagen… :smile:)

*gg* mehr davon! So eine Suche nach dem optimalen Code macht Spaß!

Gruß Rainer

Hallo Rainer,

Ich gebe mich geschlagen… :smile:)

*gg* mehr davon! So eine Suche nach dem optimalen Code macht
Spaß!

Da hast du echt Recht! (Daaa, haste mehr davon! :smile: )
Kann mal bitte jemand eine neue Aufgabe dieser Art stellen, aber etwas simples bitte, damit ich es auch verstehe! xD

Gruß, Simon

Programmier - Spielerei
Hi Simon,

Da hast du echt Recht! (Daaa, haste mehr davon! :smile: )
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. :smile:

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.

Gruß Rainer

Hi,

Da hast du echt Recht! (Daaa, haste mehr davon! :smile: )
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. :smile:

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 :smiley:.

Gruß, Simon

Hi Simon,

Ich werde morgen mal etwas entwerfen, habe jetzt nicht viel
Zeit

ja sicher doch, das ist ja nur eine Spielerei, ein Code auf den Niemand wartet.

und bisher fällt mir nur die Möglichkeit ein, jede
Kombination zu prüfen:smile:)

Das interessante ist dabei hauptsächlich erst mal der Code, der alle Kombinationen erzeugt.

Wikipedia half mir aber schonmal deinen Tipp „Rekursion“ zu
übersetzen :smiley:.

Das ist etwas, das mn ruhig immer mal wieder üben kann. :smile:

Viel Spaß! Und denk Dir auch mal etwas für mich aus.

Gruß Rainer

Hallo,

dann werfe ich auch mal eine Variante in den Raum :smile:

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

Ist ungetestet, muesste aber ihren Dienst tun :wink:

MfG Alex

Ot Stapelüberlauf bei Rekursion, wann kommt der?

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?

Danke und Gruß
Reinhard

Hallo Reinhard,

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. :smile: 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.

Gruß Rainer

Denkfehler
Hallo reinhard,

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. :frowning:

Fällt Dir nicht etwas richtig Schönes ein?

Gruß Rainer

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. :frowning:

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

Gruß
Reinhard

Hi Rainer,

ich muss gestehen, dass ich trotz Kopfzerbrechen keinen funktionierenden Code hinbekommen hab!!

Jetzt wo ich deinen sehe, macht es allerdings Sinn!! xDD

Gruß, Simon