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
#11
Hallo Atilla,

Deine Variante ist ca. 1/3 schneller, erzeugt aber eine Menge von Dopplern, was definitiv nicht gewünscht ist.
Gruß

Edgar

Meine Antworten sind freiwillig und ohne Gewähr!
Über Rückmeldungen würde ich mich freuen.
Antworten Top
#12
(25.02.2015, 13:15)BoskoBiati schrieb: Hallo Atilla,

Deine Variante ist ca. 1/3 schneller

Hallo Edgar,

ich habe das bei mir genau umgekehrt beobachtet.

Das mit den Dopplern hatte ich festgestellt. Aber Du hast recht. Das darf natürlich nicht sein.
Danke für den Hinweis.

Wie ich schon schrieb, werde ich mich heute Abend noch einmal damit auseinander setzen.
Gruß Atilla
Antworten Top
#13
Hallo Atilla,

Deine Variante ist mehr als doppelt so schnell, aber ich verstehe die Abläufe schon mal gar nicht, das ist mir noch viel zu tief in VBA.

Hier mal meine Werte aus mehreren Testläufen:

Arbeitsblatt mit dem Namen 'Tabelle1'
 MNO
2Edgar0,435 
3Atilla0,18442%
Diese Tabelle wurde mit Tab2Html (v2.4.1) erstellt. ©Gerd alias Bamberg
Gruß

Edgar

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

Du verlierst die meiste Zeit beim schreiben in die Tabelle.

Statt in die Tabelle Zeileweise zu übertragen, überträgst Du nochmal in ein Array.
Den Inhalt dieses Arrays schreibst Du in einem Rutsch in den Bereich A1:D1000.

Hier Deine Variante mit den erwähnten Änderungen:

Code:
Option Explicit

Sub Klick()
 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
Application.ScreenUpdating = False

   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
Application.ScreenUpdating = True
End Sub

Da kann mein Code nicht mehr mithalten.

Mein Code ist aber auch ziemlich unbrauchbar. Da habe ich Mist zusammengebastelt.

Bei Dir würde ich auf diesen Teil noch ganz verzichten:
Code:
.NumberFormat = "General"
.Value = .Value

Ich würde die Formate in der Tabelle schon vorgeben.
Gruß Atilla
Antworten Top
#15
Hallo zusammen,

hier eine andere Variante.

Code:
Sub EintausendZufallszahlenOhneDoppelte()
Dim Varray As Variant
Dim i As Integer
Dim Zahl As Integer
Dim Zahl2 As Integer
Dim Zufall As String
Dim z As Long
   
   'Werte zwischen 0 und 36 in Array schreiben
   ReDim Varray(0 To 36)
   For i = 0 To 36
       Varray(i) = i
   Next i
   
'Schleife für das Schreiben der Ergebnisse
For z = 1 To 1000
   'Werte werden innerhalb des Arrays umsortiert
   For i = 36 To 0 + 1 Step -1
       Zahl = Int(Rnd() * (i - 0 + 1)) + 0
       Zahl2 = Varray(Zahl)
       Varray(Zahl) = Varray(i)
       Varray(i) = Zahl2
   Next i
   
   Anzahl = 4
   
   '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("A" & z) = Zufall
       Tabelle1.Range("A" & z) = Mid(Trim(Tabelle1.Range("A" & z)), 2)
   Next i
   Zufall = ""
Next z

End Sub

Klappt leider nicht bei jedem Versuch ohne doppelte aber ich blicke es nicht mehr.
Vielleicht hat jemand von Euch noch eine Idee dazu.

Würde mich über Feedback freuen.

BTW: Arrays mag ich immer noch nicht :20:.

Gruß
Max
Antworten Top
#16
Hallo Edgar,

wenn ich das richtig beobachte, dann kommen bei Dir auch doppelte vor.
Sowohl mit Deinem Original Code als auch mit dem von mir angepassten.

Arbeitsblatt mit dem Namen 'Tabelle3'
 ABCDEFGHI
15810295#8#10#291962100071

ZelleFormel
E1=A1&"#"&B1&"#"&C1&"#"&D1
F1=ZÄHLENWENN($E$1:$E$2001;E1)
G1=ZÄHLENWENN(F1:F2001;"=1")
H1=ANZAHL(F1:F2000)
I1=VERGLEICH(2;F:F;0)
Diese Tabelle wurde mit Tab2Html (v2.4.1) erstellt. ©Gerd alias Bamberg


Teste gleich noch mit # als Trenner statt Leerzeichen im Code
Gruß Atilla
Antworten Top
#17
Hallo Max,

bei mir kommt mit Deinem Code so etwas raus:

Arbeitsblatt mit dem Namen 'Tabelle4'
 A
17, 14, 32, 11
21, 3, 30, 26
38, 32, 34, 16
4, 3, 8, 2
57, 31, 30, 3
69, 10, 4, 28
75, 25, 16, 11
82
94
101
110
12 
13 
14 
150
16 
Diese Tabelle wurde mit Tab2Html (v2.4.1) erstellt. ©Gerd alias Bamberg


Du solltest Dir unbedingt angewöhnen mit Optin Explicit zu arbeiten.
Dann würdest Du sofort erkennen ob Variablen deklariert sind und kannst dann vermeiden in Fehler zu laufen.
In diesem Fall war Anzahl nicht deklariert.
Gruß Atilla
Antworten Top
#18
Hallo Atilla,

ich habe den Code bei mir mindestens 20 Mal laufen lassen, ohne einmal so ein Ergebnis zu bekommen.
Ich wusste, dass ich Anzahl nicht deklariert hatte.
Aber warum kommt bei Dir direkt so ein Mist und bei mir läuft der Code mehrfach sauber?

Das mit dem Option Explicit hatte ich ja schon versprochen...
Der Geist ist willig aber die Finger sind schwach :32:

Gruß
Max
Antworten Top
#19
Hi,

hier jetzt mit Deklaration.

Code:
Option Explicit


Sub EintausendZufallszahlenOhneDoppelte()
Dim Varray As Variant
Dim i As Integer
Dim Zahl As Integer
Dim Zahl2 As Integer
Dim Zufall As String
Dim z As Long
Dim Anzahl As Long
    
    'Werte zwischen 0 und 36 in Array schreiben
    ReDim Varray(0 To 36)
    For i = 0 To 36
        Varray(i) = i
    Next i
    
'Schleife für das Schreiben der Ergebnisse
For z = 1 To 1000
    'Werte werden innerhalb des Arrays umsortiert
    For i = 36 To 0 + 1 Step -1
        Zahl = Int(Rnd() * (i - 0 + 1)) + 0
        Zahl2 = Varray(Zahl)
        Varray(Zahl) = Varray(i)
        Varray(i) = Zahl2
    Next i
    
    Anzahl = 4
    
    '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("A" & z) = Zufall
        Tabelle1.Range("A" & z) = Mid(Trim(Tabelle1.Range("A" & z)), 2)
    Next i
    Zufall = ""
Next z

End Sub

Gruß
Max

Edit:
... und Option Explicit :32: Da wa es wieder!
Antworten Top
#20
Hallo Max,

ich bekomme immer noch das gleiche Egebnis. Au?erdem bei jedem Durchlauf die gleichen Zahlen.
Also keine Zufallszahlen. Ich habe mir Deinen Code aber nicht genau angesehen, dass ich sagen könnte woran es liegt.
Aber an der fehlenden Deklaration sicher nicht. Das hat hier keine Auswirkungen.

Du musst Option Explicit nicht hier einstellen, sondern bei Dir nutzen.
Mir fiel das ja deswegen auf, weil es bei mir immer drin ist. Das kannst Du im Editor in den Optionen einstellen.
Das weiß Du aber sicher.
Gruß Atilla
Antworten Top


Gehe zu:


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