Private Sub Lotto()
Range("C3:Q47").ClearContents
Dim gezogen() As Boolean, x, y, z, arr(1 To 15, 1 To 6)
ReDim gezogen(1 To 45)
Randomize
For x = 1 To 7
For y = 1 To 6
Do
z = Int(Rnd * 45) + 1
Loop Until Not gezogen(z)
gezogen(z) = True
arr(x, y) = z
Next y
Next x
y = 1
For x = 1 To 45
If gezogen(x) = False Then
arr(8, y) = x
y = y + 1
End If
Next x
ReDim gezogen(1 To 45)
For x = 1 To 3
gezogen(arr(8, x)) = True
Next x
For x = 4 To 6
Do
z = Int(Rnd * 45) + 1
Loop Until Not gezogen(z)
gezogen(z) = True
arr(8, x) = z
Next x
For x = 1 To 3
gezogen(arr(8, x)) = False
Next x
For x = 9 To 15
For y = 1 To 6
Do
z = Int(Rnd * 45) + 1
Loop Until Not gezogen(z)
gezogen(z) = True
arr(x, y) = z
Next y
Next x
For x = 1 To 15
For y = 1 To 6
Cells(arr(x, y) + 2, x + 2) = 1
Next y
Next x
End Sub
Sub Lotto()
Dim gezogen() As Boolean
Dim u As Long, x As Long, y As Long, z As Long
Dim arrOut(14, 5)
Dim arrChk(1 To 45) As Long
Dim rngOut As Range
Set rngOut = Tabelle1.Range("A1").Resize(15, 6)
rngOut.ClearContents
Randomize
For x = 1 To 15
u = IIf(x < 8, 1, 2)
Select Case x
Case 1 To 7, 9 To 14
For y = 1 To 6
Do
z = Int(Rnd * 45) + 1
Loop Until arrChk(z) < u
arrChk(z) = arrChk(z) + 1
arrOut(x - 1, y - 1) = z
Next y
Case 8
'Die 3 letzen der ersten 45
ReDim gezogen(1 To 45)
y = 1
For z = 1 To 45
If arrChk(z) < 1 Then
arrOut(x - 1, y - 1) = z
gezogen(z) = True
arrChk(z) = arrChk(z) + 1
y = y + 1
End If
Next
'plus 3 neue, ungleich der ersten 3
For y = 4 To 6
Do
z = Int(Rnd * 45) + 1
Loop Until Not gezogen(z) And arrChk(z) < u
gezogen(z) = True
arrChk(z) = arrChk(z) + 1
arrOut(x - 1, y - 1) = z
Next
Case 15
'was von den 2ten 45 übrig ist
y = 1
For z = 1 To 45
If arrChk(z) < 2 Then
' arrChk(z) = arrChk(z) + 1
arrOut(x - 1, y - 1) = z
y = y + 1
End If
Next
End Select
Next x
rngOut = arrOut
End Sub
Sub Lotto()
Dim gezogen() As Boolean
Dim u As Long, x As Long, y As Long, z As Long
Dim arrOut(14, 5)
Dim arrChk(1 To 45) As Long
Dim rngOut As Range
Set rngOut = Tabelle1.Range("A1").Resize(15, 6)
rngOut.ClearContents
Randomize
For x = 1 To 15
ReDim gezogen(1 To 45)
For y = 1 To 6
u = IIf((x - 1) * 6 + y > 45, 2, 1)
Do
z = Int(Rnd * 45) + 1
Loop Until Not gezogen(z) And arrChk(z) < u
gezogen(z) = True
arrChk(z) = arrChk(z) + 1
arrOut(x - 1, y - 1) = z
Next y
Next x
rngOut = arrOut
End Sub
Sub Lotto()
Dim gezogen() As Boolean
Dim u As Long, x As Long, y As Long, z As Long
Dim arrOut(14, 5)
Dim rngOut As Range
Set rngOut = Tabelle1.Range("A1").Resize(15, 6)
rngOut.ClearContents
Randomize
For x = 1 To 15
ReDim gezogen(1 To 45)
For y = 1 To 6
Do
z = Int(Rnd * 45) + 1
Loop Until Not gezogen(z)
gezogen(z) = True
arrOut(x - 1, y - 1) = z
Next y
Next x
rngOut = arrOut
End Sub
Sub Lotto()
Dim gezogen() As Boolean
Dim zugverbraucht() As Boolean
Dim u As Long, x As Long, y As Long, z As Long
Dim arrOut(14, 5)
Dim rngOut As Range
Set rngOut = Tabelle1.Range("A1").Resize(15, 6)
rngOut.ClearContents
Randomize
ReDim zugverbraucht(1 To 90)
For x = 1 To 15
ReDim gezogen(1 To 45)
For y = 1 To 6
Do
u = Int(Rnd * 90) + 1
z = (u - 1) Mod 45 + 1
Loop Until Not gezogen(z) And Not zugverbraucht(u)
gezogen(z) = True
zugverbraucht(u) = True
arrOut(x - 1, y - 1) = z
Next y
Next x
rngOut = arrOut
End Sub
Sub Lotto_6aus45_jedeZahl2x()
Dim i As Long, j As Long, k As Long, r As Long
Dim x
Dim Kugeln(1 To 45)
Dim Reihen(1 To 3)
Dim Ergebnis(1 To 15, 1 To 6)
For r = 1 To 3
For k = 1 To 45
Kugeln(k) = Format(k, " 00")
Next
For i = 1 To 45
j = WorksheetFunction.RandBetween(1, 45)
x = Kugeln(i)
Kugeln(i) = Kugeln(j)
Kugeln(j) = x
Next
Reihen(r) = Kugeln
Next
For i = 1 To 3
k = Application.Match(Reihen(2)(i), Reihen(1), 0)
Reihen(1)(k) = ""
Next
For i = 4 To 6
k = Application.Match(Reihen(2)(i), Reihen(3), 0)
Reihen(3)(k) = ""
Next
For i = 7 To 45
Reihen(2)(i) = ""
Next
x = ""
For r = 1 To 3
x = x & Join(Reihen(r), "")
Next
x = Split(x, " ")
k = 0
For i = 1 To 15
For j = 1 To 6
k = k + 1
Ergebnis(i, j) = CLng(x(k))
Next
Next
Cells(2, 1).Resize(15, 6) = Ergebnis
End Sub
Sub Lotto()
Dim gezogen() As Boolean
Dim zugverbraucht() As Boolean
Dim ziehungen As Long, x As Long, y As Long, z As Long
Dim arrOut() As Variant
Dim rngOut As Range
ziehungen = 45
Set rngOut = Tabelle1.Range("A1").Resize(ziehungen, 6)
rngOut.ClearContents
ReDim arrOut(ziehungen, 5)
Randomize
For x = 1 To ziehungen
ReDim gezogen(1 To 45)
For y = 1 To 6
If ((x - 1) * 6 + y) Mod 45 = 1 Then
ReDim zugverbraucht(1 To 45)
End If
Do
z = Int(Rnd * 45) + 1
DoEvents
Loop Until Not gezogen(z) And Not zugverbraucht(z)
gezogen(z) = True
zugverbraucht(z) = True
arrOut(x - 1, y - 1) = z
Next y
Next x
rngOut = arrOut
End Sub
Sub Lotto()
Dim gezogen() As Boolean
Dim n As Long, x As Long, y As Long, z As Long, k As Long
Dim arrOut(14, 5)
Dim verbraucht() As Boolean
Dim rngOut As Range
Set rngOut = Tabelle1.Range("A1").Resize(15, 6)
rngOut.ClearContents
Randomize
For x = 1 To 15
ReDim gezogen(1 To 45)
For y = 1 To 6
n = n + 1
If n Mod 45 = 1 Then
ReDim verbraucht(1 To 45)
End If
If (n Mod 45 > 39) And (n Mod 6 = 1) Then
Debug.Print n,
For z = 1 To 45
If Not verbraucht(z) Then
arrOut(x - 1, y - 1) = z
y = y + 1
n = n + 1
gezogen(z) = True
End If
Next
n = n - 1
y = y - 1
Else
Do
z = Int(Rnd * 45) + 1
k = k + 1
Loop Until Not gezogen(z) And Not verbraucht(z)
gezogen(z) = True
verbraucht(z) = True
arrOut(x - 1, y - 1) = z
End If
Next
Next x
Debug.Print k
rngOut = arrOut
End Sub
Sub lottoShuffle()
Dim arrOut(14, 5) As Variant
Dim arrNumbers(1 To 42) As Integer
Dim gezogen(1 To 45) As Boolean
Dim u As Long, i As Long, j As Long, k As Long, x As Long, y As Long, z As Long
Dim v As Variant
Randomize
x = 0
For y = 1 To 6
Do
z = Int(Rnd * 45) + 1
Loop Until Not gezogen(z)
gezogen(z) = True
arrOut(x, y - 1) = z
Next
x = 1: y = 0
For i = 1 To 2
k = 1: u = 1
For j = 1 To 45
If Not gezogen(j) Or u > 3 Then
arrNumbers(k) = j
k = k + 1
Else
gezogen(j) = False
u = u + 1
End If
Next
shuffleArray arrNumbers
For Each v In arrNumbers
arrOut(x, y) = v
y = y + 1
If y > 5 Then y = 0: x = x + 1
Next
Next
Tabelle1.Range("A1").Resize(15, 6) = arrOut
End Sub
Sub shuffleArray(ByRef arrIn As Variant)
'shuffle nach Fisher-Yates
Dim lngLower As Long
Dim lngUpper As Long
Dim i As Long, z As Long
Dim vField As Variant
Randomize
lngUpper = UBound(arrIn)
lngLower = LBound(arrIn)
For i = lngUpper To lngLower + 1 Step -1
z = Int(Rnd * i) + lngLower
vField = arrIn(i)
arrIn(i) = arrIn(z)
arrIn(z) = vField
Next
End Sub
Sub shuffleArray(ByRef arrIn As Variant)
...
z = Int(Rnd * (i - lngLower + 1)) + lngLower
...
End Sub
mit RND:
LottoShuffle Mean: 0,315s StddDev.: 0,021s
Lotto_6aus45_jedeZahl2x Mean: 3,744s StddDev.: 0,104s
Lotto Mean: 0,327s StddDev.: 0,022s
mit RandBetween:
LottoShuffle Mean: 8,751s StddDev.: 0,325s
Lotto_6aus45_jedeZahl2x Mean: 16,714s StddDev.: 0,363s
Lotto Mean: 19,596s StddDev.: 0,311s
Sub test()
Dim i As Long, z() As Long
Randomize
ReDim z(9999, 3)
For i = 0 To 9999
' Randomize
z(i, 0) = WorksheetFunction.RandBetween(0, 100)
z(i, 1) = WorksheetFunction.RandBetween(0, 100)
z(i, 2) = Int(Rnd * 101)
z(i, 3) = Int(Rnd * 101)
Next
Range("A1").Resize(1000, 4) = z
End Sub
Sub Lotto()
Dim gezogen() As Boolean
Dim n As Long, x As Long, y As Long, z As Long, k As Long
Dim arrOut(14, 5)
Dim verbraucht() As Boolean
Randomize
For x = 1 To 15
ReDim gezogen(1 To 45)
For y = 1 To 6
n = n + 1
If n Mod 45 = 1 Then
ReDim verbraucht(1 To 45)
End If
If (n Mod 45 > 39) And (n Mod 6 = 1) Then
For z = 1 To 45
If Not verbraucht(z) Then
arrOut(x - 1, y - 1) = z
y = y + 1
n = n + 1
gezogen(z) = True
End If
Next
n = n - 1
y = y - 1
Else
Do
' z = WorksheetFunction.RandBetween(1, 45)
z = Int(Rnd * 45) + 1
k = k + 1
Loop Until Not gezogen(z) And Not verbraucht(z)
gezogen(z) = True
verbraucht(z) = True
arrOut(x - 1, y - 1) = z
End If
Next
Next x
Tabelle1.Range("A1").Resize(15, 6) = arrOut
End Sub
Sub LottoShuffle()
Dim arrOut(14, 5) As Variant
Dim arrNumbers(1 To 42) As Integer
Dim gezogen(1 To 45) As Boolean
Dim u As Long, i As Long, j As Long, k As Long, x As Long, y As Long, z As Long
Dim v As Variant
Randomize
x = 0
For y = 1 To 6
Do
' z = WorksheetFunction.RandBetween(1, 45)
z = Int(Rnd * 45) + 1
Loop Until Not gezogen(z)
gezogen(z) = True
arrOut(x, y - 1) = z
Next
x = 1: y = 0
For i = 1 To 2
k = 1: u = 1
For j = 1 To 45
If Not gezogen(j) Or u > 3 Then
arrNumbers(k) = j
k = k + 1
Else
gezogen(j) = False
u = u + 1
End If
Next
ShuffleArray arrNumbers
For Each v In arrNumbers
arrOut(x, y) = v
y = y + 1
If y > 5 Then y = 0: x = x + 1
Next
Next
Tabelle1.Range("A1").Resize(15, 6) = arrOut
End Sub
Sub ShuffleArray(ByRef arrIn As Variant)
'shuffle nach Fisher-Yates
Dim lngLower As Long
Dim lngUpper As Long
Dim i As Long, z As Long
Dim vField As Variant
Randomize
lngUpper = UBound(arrIn)
lngLower = LBound(arrIn)
For i = lngUpper To lngLower + 1 Step -1
z = Int(Rnd * (i - lngLower + 1)) + lngLower
' z = WorksheetFunction.RandBetween(lngLower, i)
vField = arrIn(i)
arrIn(i) = arrIn(z)
arrIn(z) = vField
Next
End Sub
Sub Lotto_6aus45_jedeZahl2x()
'daniel bei herber.de
Dim i As Long, j As Long, k As Long, r As Long
Dim x
Dim Kugeln(1 To 45) As Variant
Dim Reihen(1 To 3) As Variant
Dim Ergebnis(1 To 15, 1 To 6)
Randomize
For r = 1 To 3
For k = 1 To 45
Kugeln(k) = Format(k, " 00")
Next
For i = 1 To 45
' j = WorksheetFunction.RandBetween(1, 45)
j = Int(Rnd * 45) + 1
x = Kugeln(i)
Kugeln(i) = Kugeln(j)
Kugeln(j) = x
Next
Reihen(r) = Kugeln
Next
For i = 1 To 3
k = WorksheetFunction.Match(Reihen(2)(i), Reihen(1), 0)
Reihen(1)(k) = ""
Next
For i = 4 To 6
k = WorksheetFunction.Match(Reihen(2)(i), Reihen(3), 0)
Reihen(3)(k) = ""
Next
For i = 7 To 45
Reihen(2)(i) = ""
Next
x = ""
For r = 1 To 3
x = x & Join(Reihen(r), "")
Next
x = Split(x, " ")
k = 0
For i = 1 To 15
For j = 1 To 6
k = k + 1
Ergebnis(i, j) = CLng(x(k))
Next
Next
Tabelle1.Range("A1").Resize(15, 6) = Ergebnis
End Sub
-lottoShuffle Mean: 0,336s StddDev.: 0,048s
-Lotto_6aus45_jedeZahl2x Mean: 5,611s StddDev.: 0,228s
-Lotto Mean: 0,336s StddDev.: 0,040s
-LottoStringShuffle Mean: 2,066s StddDev.: 0,122s
Sub getPairs()
Dim pairs As BetterArray ' Array der Klasse BetterArray vorbereiten
Dim i As Byte ' Schleifenzähler
Dim temp As Byte ' Hilfsvariable zum Tausch eines Platzes im Array
Dim check As Boolean ' Solange es gleiche Paare gibt, weiter prüfen und tauschen
Set pairs = New BetterArray ' Array vom Datentyp Better Array bereit stellen
' Array initialisieren
For i = 0 To 45
pairs.Push i
Next i
' Array Elemente dureinader würfeln
pairs.Shuffle
' Gleiche Paare verhindern
' Solange, bis sicher ist, dass es keine mehr gibt
Do
' Zunächst letztes Paar auslassen, weil es bei
' Gleichheit kein Folgepaar gibt
For i = 1 To 44
If i = pairs(i) Then
temp = pairs(i)
pairs(i) = pairs(i + 1)
pairs(i + 1) = temp
End If
Next i
' Paar 45 vergleichen
' Bei Gleichheit mit Paar 1 tauschen
If pairs(45) = 45 Then
temp = pairs(45)
pairs(45) = pairs(1)
pairs(1) = temp
Else
check = True
End If
Loop Until check
' Zahlenpaare ausgeben
For i = 1 To 45
ActiveSheet.Cells(i, 1) = i
ActiveSheet.Cells(i, 2) = pairs(i)
Next i
End Sub