Excel Zufallszahlen ohne Wiederholung mit VBA (Lottogenerator)?
Hallo! Ich probiere mich derzeit an Excel aus und möchte mit VBA einen Zufallsgenerator machen. Nun habe ich das Problem, dass die Zahlen sich manchmal wiederholen. Das würde ich gerne verhindern. Hier mein Code:
Sub ZufallDoppelSort() reihe = 1 spalte = 1 Randomize Timer For zahlen = 1 To 6 zfz = Int((49 * Rnd) + 1) Cells(reihe, spalte) = zfz reihe = reihe + 1 Next zahlen End Sub
Leider finde ich bei Google nichts das mir hilft.
lg
3 Antworten
Ich würde einfach die nächste Zufallszahl generieren, falls eine vorhanden ist.
Sub ZufallDoppelSort() Dim AnzZZ As Integer Dim reihe As Integer Dim rZZ As Range Dim spalte As Integer Dim zfz As Integer
reihe = 1 spalte = 1 AnzZZ = 6 Randomize Timer
Set rZZ = Range(Cells(1, spalte), Cells(AnzZZ, spalte)) rZZ.Clear While reihe <= AnzZZ zfz = Int((49 * Rnd) + 1) If WorksheetFunction.CountIf(rZZ, zfz) = 0 Then Cells(reihe, spalte).Value = zfz reihe = reihe + 1 Else Debug.Print zfz & " abgewiesen, da bereits vorhanden." End If Wend End Sub
Danke! Der einzige Unterschied ist, dass ich keine Liste parallel führe, bzw. einfach auf die ins Arbeitsblatt geschriebenen Werte zugreife.
Ich würde es so lösen.
Ich fülle ein Array mit dem Wertevorrat von 1-49. Wird nun z.B. die Zufallszahl 7 generiert, so nehme ich den Wert aus dem Array mit dem Index 7, was zunächst auch 7 ist. Dann setze ich den Wert in dem Array mit dem Index 7 auf 0 und zähle einen Schleifenzähler hoch. Wird nun die 7 abermals ermittelt, erhalte ich die 0 zurück und weiß, dass diese Zahl schon mal gezogen wurde.
Angepasst werden muss dann auch die feste For-Schleife durch durch eine While-Schleife, die solange durchlaufen wird, bis 6 unterschiedliche Zahlen ermittelt wurden.
Ich weiß leider nicht was du meinst, muss dazu auch sagen das ich blutige Anfängerin bin. Was ist ein Array?
Ein Array (Feld) ist eine indizierte Liste von Werten gleichen Typs. Die einzelnen Werte (Elemente) werden über den gleichen Namen mit unterschiedlichem Index angesprochen.
Dim arr(48) As Integer Dim i As Integer For i = 0 To 48 arr(i) = i + 1 Next
Dank dir. So wie ich es erklärt habe, würde der Index halt von 1 bis 49 reichen, damit man die Zufallszahl direkt als Index benutzen kann. Da ja keine Zufallszahl 0 generiert wird, bleibt die Speicherstelle 0 halt unberücksichtigt.
Wenn du im Grunde nur den Index benötigst, wäre es meiner Meinung nach besser, eine Liste mit allen ermittelten Zufallszahlen zu pflegen, also nicht die ermittelten herauszustreichen, sondern einfach die ermittelten hinzuzufügen und nach Generierung einer neuen Zufallszahl prüfen, ob die Zahl bereits enthalten ist (am besten in einer Hilfsprozedur).
Quick and dirty wäre, die ermittelten Zahlen einfach in eine Zeichenkette zu speichern und mit InStr auf Vorhandensein zu prüfen: "|Zahl1|Zahl2|...|Zahln|", Suche nach "|Zahlx|".
definiere Füllbereich As Range und füge dazwischen:
if countif(Füllbereich, zfz) > 0 then zahlen = zahlen -1: next zahlen
'das einzeilige if... then braucht weder else und endif, wenn nicht erfüllt, wird der Code einfach fortgesetzt.
Hab das jetzt nicht nachgestellt, aber das Konzept müsste gehen, ggf ein paar Syntax-Kottekturen.
zB könnte es sein, dass Countif eine Worksheetfunction ist, dann
if Application.Worksheetfunction.countif(..., zfz) > 0 then zahlen = ...
Dankeschön, das probiere ich mal aus.