Excel Vba mehrere Zufallszahlen, jedoch keine Wiederholungen?


01.08.2021, 21:22

Der Bereich der Zufallszahlen sollte von 1 bis 60 sein, allerdings ist das zu vernachlässigen

4 Antworten

Hallo, du willst also so etwas erreichen, wie einen Stapel Karten zu mischen.

Eine andere Herangehensweise wäre dafür, z.B. 1000 mal 2 Zufallszahlen im gewünschten Bereich zu generieren und die jeweiligen Werte in den 2 zufälligen Zellen zu vertauschen. Am Ende sind die Werte "gut gemischt".

Woher ich das weiß:eigene Erfahrung – Faulheit >> Neugier >> Wissen

Ich würde so vorgehen

  • Du speicherst alle Zufallszahlen
  • Bei jeder neuen Zufallszahl prüfst du, ob sie bereits gespeichert wurde.
  • Wenn ja, ziehst du eine neue Zufallszahl
  • Wenn nicht, fügst du die Zahl der gespeicherten Liste hinzu.

Beispiellösung:

Sub optimierer()
   Const intMin = 1
   Const intMax = 60
   Dim arrZZ As Collection
   Dim i As Integer
   Dim zz As Integer

   Set arrZZ = New Collection
   Randomize
   While arrZZ.Count < 10
       zz = CInt((Rnd() * intMax) + intMin)
       If Not ArrContaining(arrZZ, zz) Then _
           arrZZ.Add (zz)
   Wend

   For i = 1 To arrZZ.Count
       Debug.Print arrZZ(i)
   Next

   Set arrZZ = Nothing
End Sub

Function ArrContaining(arr As Collection, intSuchzahl As Integer) As Boolean
   Dim i As Integer
   ArrContaining = False
   For i = 1 To arr.Count
       If arr(i) = intSuchzahl Then
           ArrContaining = True
           Exit Function
       End If
   Next i
End Function

Kinlerka 
Fragesteller
 02.08.2021, 14:09

Vielen Dank für die super schnelle und sehr hilfreieche Antwort Suboptimierer! :)

Das ist eine sehr gute Idee und hat mir bei meinem Projekt weitergeholfen.

1

Meine Idee ist die 10 gesuchten Zufallszahlen von 0 bis 60 auf 10 Bereiche aufzuteilen. Der erste Bereich wird mit einer Zufallszahl zwischen 0 bis 6 gefüllt, der zweite Bereich dann zwischen 6 und 12 usw. So wird vermieden, dass eine Zufallszahl doppelt vorkommt. Die Zufallszahlen sind in einem Array gespeichert und am Ende aufsteigend sortiert.

Mein Code:

Sub zufallszahlenprogramm()

'Array zum Speichern der 10 Stück Zufallszahlen
Dim arrayZahlen(1 To 10) As Integer

'Bereichsangabe der Zufallszahlen
anfang = 0
ende = 60
mengeZufallszahlen = 10 'Wie viele Zufallszahlen entstehen sollen. Muss mit der Arraygröße übereinstimmen.

bereichsweite = ende / mengeZufallszahlen

For i = 1 To mengeZufallszahlen
    
    bereichEnde = bereichEnde + bereichsweite
    arrayZahlen(i) = Int(((bereichEnde - bereichAnfang) * Rnd) + bereichAnfang)
    bereichAnfang = bereichAnfang + bereichsweite + 0.00001
Next
Stop ' Hier hat man Zeit sich das fertige Array anzuschauen
End Sub




Ich verstehe deine Frage nicht. Entweder eine Zahl ist zufällig oder entspricht bestimmten Kriterien - ist also nicht zufällig. Du gibst Kriterien an die deine "Zufallszahl" erfüllen soll - also kann es kein Zufall sein!


Suboptimierer  02.08.2021, 09:21

Eine Zahl kann sowohl zufällig sein, als auch bestimmten Kriterien genügen.

Beispiel Münzwurf. Kopf = 1, Zahl = 0. Der Münzwurf ist zufällig, aber die Zahl muss dem Kriterium genügen, 0 oder 1 zu sein.

Beispiel Lotto. Es wird aus 49 Zahlen gezogen. Das Kriterium ist, dass die Zahl aus der Menge an Kugeln mit den Zahlen 1 bis 49 sein muss. Beim zweiten Ziehen ist das Kriterium, dass alle Zahlen bis auf die zuerst gezogene möglich sind.
Beide Ziehvorgänge sind zufällig.

1