Excel Zufallszahlen ohne Wiederholung mit VBA (Lottogenerator)?

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
Woher ich das weiß:Berufserfahrung – Programmierer

ProRatione  25.07.2017, 11:25

Sehr schön, ähnlich gelöst, aber wesentlich eleganter.

0
Suboptimierer  25.07.2017, 11:30
@ProRatione

Danke! Der einzige Unterschied ist, dass ich keine Liste parallel führe, bzw. einfach auf die ins Arbeitsblatt geschriebenen Werte zugreife.

1
Hermili 
Beitragsersteller
 25.07.2017, 11:23

Vielen, Vielen Dank. Es hat funktioniert.

1
Hermili 
Beitragsersteller
 25.07.2017, 11:18

Dankeschön, das probiere ich mal aus.

1

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.



Hermili 
Beitragsersteller
 25.07.2017, 11:24

Danke euch

0
Hermili 
Beitragsersteller
 25.07.2017, 11:08

Ich weiß leider nicht was du meinst, muss dazu auch sagen das ich blutige Anfängerin bin. Was ist ein Array?

0
Suboptimierer  25.07.2017, 11:20
@Hermili

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
2
ProRatione  25.07.2017, 11:22
@Suboptimierer

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.

0
Suboptimierer  25.07.2017, 11:28
@ProRatione

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|".

0

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 = ...