Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

Zufallszahlen generieren
#21
Hallo Atilla,

verstehe ich nicht...
Hier mal die Ergenisse von drei Durchläufen aus den ersten 25 Zeilen.

Arbeitsblatt mit dem Namen 'Tabelle1'
 ABC
127, 14, 32, 114, 20, 31, 304, 5, 7, 6
231, 3, 30, 2624, 5, 9, 2718, 15, 0, 19
318, 32, 34, 1617, 10, 3, 289, 10, 5, 35
45, 3, 8, 213, 8, 25, 3018, 16, 13, 25
517, 31, 30, 316, 21, 35, 011, 7, 5, 19
629, 10, 4, 2826, 4, 17, 3336, 22, 23, 27
75, 25, 16, 1111, 5, 18, 1912, 11, 3, 7
836, 35, 19, 116, 27, 22, 356, 34, 4, 27
97, 2, 12, 2011, 23, 36, 190, 16, 15, 11
1036, 31, 19, 229, 17, 11, 33, 30, 0, 13
117, 26, 30, 3525, 14, 16, 2320, 23, 18, 9
121, 35, 9, 3630, 17, 18, 312, 19, 3, 15
1315, 23, 3, 3215, 21, 0, 3324, 3, 36, 4
143, 4, 11, 2028, 24, 33, 19, 21, 35, 14
154, 31, 15, 352, 35, 34, 2513, 35, 27, 0
166, 33, 3, 3223, 3, 7, 3322, 23, 19, 17
1721, 24, 6, 2525, 7, 28, 171, 7, 14, 22
1833, 3, 35, 2325, 29, 0, 168, 28, 16, 27
1917, 2, 3, 130, 34, 17, 103, 20, 25, 22
204, 34, 10, 1828, 25, 27, 58, 30, 0, 7
2124, 18, 14, 1324, 10, 35, 1820, 5, 29, 27
2223, 30, 29, 427, 20, 16, 289, 1, 31, 3
238, 24, 4, 2917, 33, 26, 1134, 30, 8, 26
2417, 27, 33, 1936, 8, 22, 515, 1, 27, 26
2536, 32, 9, 2511, 1, 9, 824, 22, 15, 9

Ich habe jedes Mal andere Werte Huh

Eine kleine Modifikation hatte ich noch im unteren Teil. Das hat aber auch keine Auswirkung auf die Werte.

Code:
'Die ersten vier Werte aus Array werden ausgelesen und an Zufall übergeben
   For i = 0 To 0 + Anzahl - 1
       Zufall = Zufall & ", " & Varray(i)
       Tabelle1.Range("C" & z) = Mid(Trim(Zufall), 2)
   Next i

Gruß
Max

Edit:
Arbeitsblatt mit dem Namen 'Tabelle1'
 ABC
123, 13, 3, 1911000
222, 16, 30, 291 
31, 19, 26, 61 
427, 4, 10, 291 
521, 27, 6, 161 
67, 0, 24, 111 
79, 4, 20, 261 
89, 18, 16, 331 
92, 26, 30, 121 
1025, 12, 11, 181 
113, 31, 18, 61 
1235, 34, 23, 321 
1324, 33, 27, 51 
143, 29, 11, 231 
1513, 25, 29, 321 
162, 32, 18, 91 
1711, 4, 29, 341 
189, 11, 7, 261 
1922, 25, 5, 261 
2021, 3, 12, 201 
2134, 28, 16, 21 
2215, 2, 0, 11 
2323, 14, 2, 241 
2415, 12, 0, 201 
2521, 25, 14, 181 

ZelleFormel
B1=ZÄHLENWENN($A$1:$A$1000;$A1)
C1=ZÄHLENWENN($B$1:$B$1000;1)
B2=ZÄHLENWENN($A$1:$A$1000;$A2)
B3=ZÄHLENWENN($A$1:$A$1000;$A3)
B4=ZÄHLENWENN($A$1:$A$1000;$A4)
B5=ZÄHLENWENN($A$1:$A$1000;$A5)
B6=ZÄHLENWENN($A$1:$A$1000;$A6)
B7=ZÄHLENWENN($A$1:$A$1000;$A7)
B8=ZÄHLENWENN($A$1:$A$1000;$A8)
B9=ZÄHLENWENN($A$1:$A$1000;$A9)
B10=ZÄHLENWENN($A$1:$A$1000;$A10)
B11=ZÄHLENWENN($A$1:$A$1000;$A11)
B12=ZÄHLENWENN($A$1:$A$1000;$A12)
B13=ZÄHLENWENN($A$1:$A$1000;$A13)
B14=ZÄHLENWENN($A$1:$A$1000;$A14)
B15=ZÄHLENWENN($A$1:$A$1000;$A15)
B16=ZÄHLENWENN($A$1:$A$1000;$A16)
B17=ZÄHLENWENN($A$1:$A$1000;$A17)
B18=ZÄHLENWENN($A$1:$A$1000;$A18)
B19=ZÄHLENWENN($A$1:$A$1000;$A19)
B20=ZÄHLENWENN($A$1:$A$1000;$A20)
B21=ZÄHLENWENN($A$1:$A$1000;$A21)
B22=ZÄHLENWENN($A$1:$A$1000;$A22)
B23=ZÄHLENWENN($A$1:$A$1000;$A23)
B24=ZÄHLENWENN($A$1:$A$1000;$A24)
B25=ZÄHLENWENN($A$1:$A$1000;$A25)
Antworten Top
#22
Hallo zusammen,

hab meine Variante etwas überarbeitet, ich denke jetzt müsste es funktionieren:

Code:
Option Explicit

Sub tausender()
 Dim j As Long, i As Long, k
 Dim lozahl As Long
 Dim varKey
 Dim varFeld1
 Dim arr1()
 Dim objDic As Object
 Dim arrZahlen, arr
 Set objDic = CreateObject("Scripting.Dictionary")
 Do
   arrZahlen = ""
   Do
     Randomize
     lozahl = Application.WorksheetFunction.RandBetween(0, 36) 'sechs unterschiedliche Zufallszahlen generieren
     If InStr(arrZahlen, lozahl) = 0 Then
       arrZahlen = lozahl & "##" & arrZahlen     'Zufallszahlen in ein mit Leerzeichen getrennt in ein Array schreiben
       i = i + 1
     End If
   Loop While i < 4

   If Not objDic.exists(arrZahlen) Then
       objDic(arrZahlen) = arrZahlen
       j = j + 1
   End If
   i = 0
 Loop While j < 1000
 arr = objDic.keys
 j = 0
 ReDim arr1(objDic.Count - 1, 3)
 For i = 0 To objDic.Count - 1
     For k = 0 To UBound(Split(arr(i), "##")) - 1
         arr1(j, k) = Split(arr(i), "##")(k)
     Next k
      j = j + 1
 Next i
 
 Range("A1:D1000") = arr1
 
End Sub
Gruß Atilla
Antworten Top
#23
Hallo Atilla,

das war der Punkt, bei dem ich hängengeblieben bin, alle Zahlen in ein Array zu schreiben.
Das Umwandeln in Zahlen war notwendig, weil die Ergebnisse immer als Texte in die zellen geschrieben wurden.
Ich habe das Schreiben in das Array jetzt noch in die erste Schleife gepackt. Jetzt habe ich drei Versionen getestet, die Unterschiede sind marginal:

Arbeitsblatt mit dem Namen 'Tabelle1'
 EF
1Klick10,5334375
2Klick20,50835938
3Klick30,4903125
Diese Tabelle wurde mit Tab2Html (v2.4.1) erstellt. ©Gerd alias Bamberg

Code:
Sub Klick1()
 Dim loB As Long
 Dim lozahl As Long
 Dim arrZahlen, arrZahlen2(3), arrZahlen3(999)
 Dim loa As Long
 Dim bolTreffer As Boolean
 
 
    loa = 0
Do
    bolTreffer = False
    arrZahlen = ""
    Do
      Randomize
      lozahl = Application.WorksheetFunction.RandBetween(0, 36) 'vier unterschiedliche Zufallszahlen generieren
      If InStr(arrZahlen, lozahl) = 0 Then
        arrZahlen = lozahl & " " & arrZahlen     'Zufallszahlen in ein mit Leerzeichen getrennt in ein Array schreiben
        arrZahlen2(loB) = lozahl
        loB = loB + 1
      End If
    Loop While loB < 4
    
    For loB = 0 To 3
       arrZahlen3(loa) = arrZahlen3(loa) & WorksheetFunction.Small(arrZahlen2, loB + 1) & " " 'Mit kkleinste sortiert den Arrayinhalt wieder zurückschreiben
    Next
    If loa > 0 Then
        For loB = 0 To loa - 1
            If arrZahlen3(loB) = arrZahlen3(loa) Then bolTreffer = True
        Next
    End If
        If bolTreffer = False Then loa = loa + 1

        loB = 0
    
 Loop While loa < 1000
 For loa = 0 To 999
    Range(Cells(loa + 1, 1), Cells(loa + 1, 4)) = Split(arrZahlen3(loa), " ")
 Next
 With Range("A1:D1000")
 .NumberFormat = "General"
 .Value = .Value
 End With

End Sub
Sub Klick2()
 Dim loa As Long
Dim loB As Long
Dim lozahl As Long
Dim k As Long
Dim arrZahlen, arrZahlen2(3), arrZahlen3(999)
Dim arr(999, 3)
Dim bolTreffer As Boolean

   loa = 0
Do
   bolTreffer = False
   arrZahlen = ""
   Do
     Randomize
     lozahl = Application.WorksheetFunction.RandBetween(0, 36) 'vier unterschiedliche Zufallszahlen generieren
     If InStr(arrZahlen, lozahl) = 0 Then
       arrZahlen = lozahl & " " & arrZahlen     'Zufallszahlen in ein mit Leerzeichen getrennt in ein Array schreiben
       arrZahlen2(loB) = lozahl
       loB = loB + 1
     End If
   Loop While loB < 4
   
   For loB = 0 To 3
      arrZahlen3(loa) = arrZahlen3(loa) & WorksheetFunction.Small(arrZahlen2, loB + 1) & " " 'Mit kkleinste sortiert den Arrayinhalt wieder zurückschreiben
   Next
   If loa > 0 Then
       For loB = 0 To loa - 1
           If arrZahlen3(loB) = arrZahlen3(loa) Then bolTreffer = True
       Next
   End If
       If bolTreffer = False Then loa = loa + 1

       loB = 0
   
Loop While loa < 1000

For loa = 0 To 999
 k = 0
 For loB = 0 To 3
   arr(loa, k) = Split(arrZahlen3(loa))(loB)
   k = k + 1
 Next loB
Next

With Range("A1:D1000")
.Value = arr
.NumberFormat = "General"
.Value = .Value
End With


End Sub
Sub Klick3()
 Dim loa As Long
Dim loB As Long
Dim lozahl As Long
Dim k As Long
Dim arrZahlen, arrZahlen2(3), arrZahlen3(999)
Dim arr(999, 3)
Dim bolTreffer As Boolean


   loa = 0
Do
   bolTreffer = False
   arrZahlen = ""
   Do
     Randomize
     lozahl = Application.WorksheetFunction.RandBetween(0, 36) 'vier unterschiedliche Zufallszahlen generieren
     If InStr(arrZahlen, lozahl) = 0 Then
       arrZahlen = lozahl & " " & arrZahlen     'Zufallszahlen in ein mit Leerzeichen getrennt in ein Array schreiben
       arrZahlen2(loB) = lozahl
       loB = loB + 1
     End If
   Loop While loB < 4
   
   For loB = 0 To 3
      arrZahlen3(loa) = arrZahlen3(loa) & WorksheetFunction.Small(arrZahlen2, loB + 1) & " " 'Mit kkleinste sortiert den Arrayinhalt wieder zurückschreiben
   Next
   If loa > 0 Then
       For loB = 0 To loa - 1
           If arrZahlen3(loB) = arrZahlen3(loa) Then bolTreffer = True
       Next
   End If
       If bolTreffer = False Then loa = loa + 1
   
 For loB = 0 To 3
   arr(loa - 1, loB) = Split(arrZahlen3(loa - 1))(loB)
 Next loB
 loB = 0
Loop While loa < 1000

With Range("A1:D1000")
.Value = arr
.NumberFormat = "General"
.Value = .Value
End With


End Sub
Gruß

Edgar

Meine Antworten sind freiwillig und ohne Gewähr!
Über Rückmeldungen würde ich mich freuen.
Antworten Top
#24
Hallo Max,

alles Ok, war meine Schludrigkeit. :@

Ich wollte in eine andere Tabelle schreiben lassen als Tablle1. Da habe ich dann nicht überall Tabell1 ersetzt.
Sorry.

Ist auch eine raffinierte Idee von Dir. Auch für dich gilt, dass Du Zeit beim Schreiben in die Tabelle verlierst.
Könntest am Ende statt in die Tabelle zu schreiben genauso in ein Array schreiben und dann diesen Array Inhalt in einem in die Tabelle schreiben.
Du hast die Zahlen in einer Zelle, wobei Edgar und ich sie in 4 Spalten verteilen. Aber je nach dem, was der TE wünscht kann das dann auch bei Dir schnell noch eingearbeitet werden.
Gruß Atilla
Antworten Top
#25
Hi Atilla,

echt jetzt?

1 Sekunde für 1000 oder auch 2000 Kombinationen.
Bei 4000 sind es dann 2 Sekunden.

Das ist aber Jammern auf ganz hohem Niveau, oder?

Gruß
Max
Antworten Top
#26
Hallo Max,

ich jammer doch nicht.

Du arbeitest doch bis kurz vor Schluss mit Arrays, warum an der entscheidenden Stelle nicht.
Entscheidend in dem Sinne, dass das Programm zum Schreiben in die Tabelle die meiste Zeit benötigt.
Gefühlt 99% der gesamten Zeit gehen bei Dir zum Schreiben drauf.
Aber wenigstens die Bildschirmaktualisierung könnte noch abgeschaltet werden. Das macht dann auch einiges aus.

Also warum nicht konsequent bis zum Ende mit Arrays weitermachen?
Gruß Atilla
Antworten Top
#27
Hallo Edgar,

hast Du bei Dir geprüft, ob Du Doppelte hast?
Ich habe jetzt die Klick2 und Klick3 getestet und erhalte jedes mal um die 20 Doppelte.

So habe ich getestet:
Arbeitsblatt mit dem Namen 'Tabelle2'
 ABCDEFGH
1111533341115333419801000
2014333501433351  

ZelleFormel
E1=A1&B1&C1&D1
F1=ZÄHLENWENN($E$1:$E$2001;E1)
G1=ZÄHLENWENN(F1:F1000;1)
H1=ANZAHL(F1:F1000)
Diese Tabelle wurde mit Tab2Html (v2.4.1) erstellt. ©Gerd alias Bamberg

und noch einmal so getestet:

Arbeitsblatt mit dem Namen 'Tabelle2'
 ABCDEFGH
111329361#13#29#3619721000

ZelleFormel
E1=A1&"#"&B1&"#"&C1&"#"&D1
F1=ZÄHLENWENN($E$1:$E$2001;E1)
G1=ZÄHLENWENN(F1:F2001;"=1")
H1=ANZAHL(F1:F2000)
Diese Tabelle wurde mit Tab2Html (v2.4.1) erstellt. ©Gerd alias Bamberg
Gruß Atilla
Antworten Top
#28
Hallo Atilla,

ich bin noch amTesten.
Gruß

Edgar

Meine Antworten sind freiwillig und ohne Gewähr!
Über Rückmeldungen würde ich mich freuen.
Antworten Top
#29
Hallo zusammen,


endlich habe ich verstanden, warum Edgar die Zahlen sortiert.

Deswegen hier meine neueste Version:

Code:
Option Explicit

Sub zufallszahlen()
 Dim j As Long, i As Long
 Dim lozahl As Long
 Dim lngAnzahl As Long
 Dim arr()
 Dim arrZahlen, arrZahlen2
 Dim objDic1 As Object, objDic2 As Object
 
 Set objDic1 = CreateObject("Scripting.Dictionary")
 Set objDic2 = CreateObject("Scripting.Dictionary")
 
 lngAnzahl = Application.InputBox("Bitte Karten-Anzahl eingeben", "Zahleneingabe", 1000, Type:=1)
 If lngAnzahl > 0 and lngAnzahl < 66045 Then
   Do
     arrZahlen2 = ""
     Do
       Randomize
       lozahl = Application.WorksheetFunction.RandBetween(0, 36) '4 unterschiedliche Zufallszahlen generieren
       If Not objDic1.exists(lozahl) Then
           objDic1(lozahl) = lozahl
       End If
     Loop Until objDic1.Count = 4
     
     arrZahlen = objDic1.keys   'Zufallszahlen in ein Array einlesen
     'sortieren des Arrayinhalts mittels der Tabellenfunktion Kkleinste und hintereinander mit # getrennt in eine Feldvariable schreiben
     For i = 4 To 1 Step -1
       arrZahlen2 = WorksheetFunction.Small(arrZahlen, i) & "##" & arrZahlen2
     Next i
     
     If Not objDic2.exists(arrZahlen2) Then 'Sammeln der Kombinationen bei gleichzeitiger Prüfung ob schon vorhanden
         objDic2(arrZahlen2) = arrZahlen2
     End If
     objDic1.RemoveAll
   Loop Until objDic2.Count = lngAnzahl
 End If
 
 arrZahlen = ""
 arrZahlen = objDic2.keys
 
 j = 0
 ReDim arr(objDic2.Count - 1, 3) 'Alle gesamelten Kombinationen bei ## trennen und in ein Array schreiben
 For i = 0 To objDic2.Count - 1
     For j = 0 To UBound(Split(arrZahlen(i), "##")) - 1
         arr(i, j) = Split(arrZahlen(i), "##")(j)
     Next j
 Next i
 
 Application.Calculation = xlCalculationManual     'Berechnung abschalten
 Columns("A:D").ClearContents                      'Spalten A bis D leeren
 Range("A1:D" & lngAnzahl) = arr                   'Den Arrayinhalt in die Tabelle schreiben
 Application.Calculation = xlCalculationAutomatic  'Berechnung einschalten
End Sub


Ich habe für den Nutzer noch eine Inputbox eingebaut.
Gruß Atilla
Antworten Top
#30
Hallo Atilla,

ich weiß jetzt auch, warum es zu Dopplern kam:
in der Schleife wurde ein doppeltes Vorkommen festgestellt, darauf wurde ein neues Array erstellt, ohne dass das alte geleert wurde. Das neue hatte dann 8Zahlen und war darum einmalig. Beim Übertrag in die Zellen wurden aber nur die ersten vier Zahlen eingetragen, also die doppelten.

Hier das verbesserte Makro:

Code:
Sub Klick2()
Dim loA As Long
Dim loB As Long
Dim lozahl As Long
Dim k As Long
Dim arrZahlen, arrZahlen2(3), arrZahlen3(999)
Dim arr(999, 3)
Dim bolTreffer As Boolean

  loA = 0
Do
  bolTreffer = False
  arrZahlen = ""
  Do
    Randomize
    lozahl = Application.WorksheetFunction.RandBetween(0, 36) 'vier unterschiedliche Zufallszahlen generieren
    If InStr(arrZahlen, lozahl) = 0 Then
      arrZahlen = lozahl & " " & arrZahlen     'Zufallszahlen in ein mit Leerzeichen getrennt in ein Array schreiben
      arrZahlen2(loB) = lozahl
      loB = loB + 1
    End If
  Loop While loB < 4
 
  For loB = 0 To 3
     arrZahlen3(loA) = arrZahlen3(loA) & WorksheetFunction.Small(arrZahlen2, loB + 1) & " " 'Mit kkleinste sortiert den Arrayinhalt wieder zurückschreiben
  Next
  If loA > 0 Then
      For loB = 0 To loA - 1
           If arrZahlen3(loA) = arrZahlen3(loB) Then
               bolTreffer = True
               arrZahlen3(loA) = ""
               Exit For
           End If
      Next
  End If
      If bolTreffer = False Then loA = loA + 1

      loB = 0
 
Loop While loA < 1000

For loA = 0 To 999
k = 0
For loB = 0 To 3
  arr(loA, k) = Split(arrZahlen3(loA))(loB)
  k = k + 1
Next loB
Next

With Range("A1:D1000")
.Value = arr
.NumberFormat = "General"
.Value = .Value
End With


End Sub
Sub Klick3()
Dim loA As Long
Dim loB As Long
Dim lozahl As Long
Dim k As Long
Dim arrZahlen, arrZahlen2(3), arrZahlen3(999)
Dim arr(999, 3)
Dim bolTreffer As Boolean


  loA = 0
Do
  bolTreffer = False
  arrZahlen = ""
  Do
    Randomize
    lozahl = Application.WorksheetFunction.RandBetween(0, 36) 'vier unterschiedliche Zufallszahlen generieren
    If InStr(arrZahlen, lozahl) = 0 Then
      arrZahlen = lozahl & " " & arrZahlen     'Zufallszahlen in ein mit Leerzeichen getrennt in ein Array schreiben
      arrZahlen2(loB) = lozahl
      loB = loB + 1
    End If
  Loop While loB < 4
 
  For loB = 0 To 3
     arrZahlen3(loA) = arrZahlen3(loA) & WorksheetFunction.Small(arrZahlen2, loB + 1) & " " 'Mit kkleinste sortiert den Arrayinhalt wieder zurückschreiben
  Next
  If loA > 0 Then
      For loB = 0 To loA - 1
           If arrZahlen3(loA) = arrZahlen3(loB) Then
               bolTreffer = True
               arrZahlen3(loA) = ""
               Exit For
           End If
      Next
  End If
      If bolTreffer = False Then loA = loA + 1
 
For loB = 0 To 3
  arr(loA - 1, loB) = Split(arrZahlen3(loA - 1))(loB)
Next loB
loB = 0
Loop While loA < 1000

With Range("A1:D1000")
.Value = arr
.NumberFormat = "General"
.Value = .Value
End With


End Sub

Ich werde mir jetzt dein neues Werk ansehen, dann gehts ins Bett.
Gruß

Edgar

Meine Antworten sind freiwillig und ohne Gewähr!
Über Rückmeldungen würde ich mich freuen.
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste