Excel Vba mehrere Zufallszahlen, jedoch keine Wiederholungen?
Hallo,
Ich brauche 10 Variabeln, die einer Zufallszahl zugewiesen sind, jedoch dürfen sich die Zufallszahlen nicht wiederholen. Also z.B.
Z1= 23
Z2= 25
Z3= 25
Z4= 19
Z6= 17
....
Die "25" kommt nun 2 mal vor und das sollte nicht sein, also müsste Z2 oder Z3 zu einer anderen Zahl geändert werden.
Wie kann man das überprüfen lassen? Gibt es eine einfache und schnelle Möglichkeit ohne viel Code? Oder müsste man jede einzelne Variable mit if überprüfen?
MfG Fabian
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".
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
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!
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.
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.