Zufallswerte: Würfel oder Lotto? mit/ohne Duplikate

.. das wohl mächtigste Werkzeug in Bill Gates' Büro-Sippe. Ob reine Formeln, PowerQuery oder VBA. Hier bleiben kaum Wünsche unerfüllt.
Benutzeravatar
d'r Bastler
Beiträge: 670
Registriert: 29. Aug 2022, 13:20
Hat sich bedankt: 175 Mal
Danksagung erhalten: 90 Mal

Zufallswerte: Würfel oder Lotto? mit/ohne Duplikate

#1

Beitrag von d'r Bastler »

Zwei Arten von numerischen Zufallswerten:
  • Würfel
Ein Wert des Zufallsbereichs kann mehrfach (Duplikate nicht ausgeschlossen), andere nicht vorkommen

Code: Alles auswählen

Option Explicit

Sub RandSixDices()
'Deklaration und Eingabe
Dim i As Integer, iMax As Integer, r As Integer, s As Integer, c As Integer

iMax = 6                    'höchste Augenzahl
s = 10                      'Anzahl Würfe mit 6 Würfeln

Cells.Clear

For c = 1 To s              'eine Spalte pro Wurf
    For i = 1 To iMax       'eine Zeile pro Würfel
        r = WorksheetFunction.RandBetween(1, 6)
        Cells(i, c) = r     'Ausgabe
    Next i
Next c
End Sub
  • Lottozahlen
Aus einem definierten Werte-Bereich werden alle Werte (Duplikate ausgeschlossen) in zufälliger Reihenfolge ausgegeben und ggf. gefiltert

Code: Alles auswählen

Option Explicit

Sub RandMarkSix()
'Deklaration und Eingabe
Dim aValues(1 To 49) As Integer     'Konstante erforderlich!
Dim aRand(1 To 49, 1 To 1)          'Konstante erforderlich!
Dim i As Integer, r As Integer, n As Integer, iSix As Integer

n = UBound(aValues)                 'Konstante in Variable zur Weiterverbeitung
iSix = 6                            'iSix aus n

Cells.Clear

'Verarbeitung
For i = 1 To n                      'aValues indizieren
    aValues(i) = i
Next i
For i = n To 1 Step -1              'aValues zufällig füllen
    r = Int((i * Rnd) + 1)
    aRand(i, 1) = aValues(r)
    aValues(r) = aValues(i)
Next i

'Ausgabe
Cells(1, 1).Resize(UBound(aRand)) = aRand   'alle Werte
For i = iSix + 1 To UBound(aRand)           'nach iSix filtern
    Cells(i, 1).Clear
Next i

End Sub
Good Luck :mrgreen:

Nachtrag: Die Mappe zeigt noch zwei Optionen: msgbox für den MarkSix-Filter und Werteverteilung für die SixDices
Zufälle.xlsb
(16.65 KiB) Noch nie heruntergeladen
d'r Bastler von den VBAsteleien.de
Win 10 + Office 2019 & Win11 + Office 2021 + Visio 2019 pro & macOS.X15 + Office2019pro & Android12 & XL365
Sulprobil
Beiträge: 22
Registriert: 23. Sep 2022, 05:54
Hat sich bedankt: 3 Mal
Danksagung erhalten: 14 Mal
Kontaktdaten:

Re: Zufallswerte: Würfel oder Lotto? mit/ohne Duplikate

#2

Beitrag von Sulprobil »

Hallo,

ich finde es gut, dass Du Duplikate durch Verschieben des Indexes (und nicht etwa mittels eines Schon-da-Tests nebst immer länger andauernden wiederholten Rand-Schleife) löst!
Zwei kleine Anregungen: Mit dem n-fachen Kopieren des Index-Arrays kann man das maximal n-fache Auftreten der Zufallszahlen erlauben. Und eine verzögerte Initialisierung dieses Arrays macht die Erzeugung von z. B. 2 Zufallszahlen aus einer Menge von 20.000.000 effizienter.
Ich habe diese so implementiert (hoffe, dass Links ok sind):
https://www.sulprobil.com/uniqrandint_en/

Viele Grüße,
Bernd
Folgende Benutzer bedankten sich beim Autor Sulprobil für den Beitrag (Insgesamt 2):
thowe, d'r Bastler
Benutzeravatar
d'r Bastler
Beiträge: 670
Registriert: 29. Aug 2022, 13:20
Hat sich bedankt: 175 Mal
Danksagung erhalten: 90 Mal

Re: Zufallswerte: Würfel oder Lotto? mit/ohne Duplikate

#3

Beitrag von d'r Bastler »

Moin Bernd,

natürlich sind konstruktive Links okay!! Kommerzielle Werbung musste ich leider schon einmal eliminieren, aber gute Ideen dürfen sich nicht nur, sondern sollen sich von hier verbreiten. Danke für Deinen Beitrag!

Grüße
Folgende Benutzer bedankten sich beim Autor d'r Bastler für den Beitrag:
Sulprobil
d'r Bastler von den VBAsteleien.de
Win 10 + Office 2019 & Win11 + Office 2021 + Visio 2019 pro & macOS.X15 + Office2019pro & Android12 & XL365
Benutzeravatar
d'r Bastler
Beiträge: 670
Registriert: 29. Aug 2022, 13:20
Hat sich bedankt: 175 Mal
Danksagung erhalten: 90 Mal

Re: Zufallswerte: Würfel oder Lotto? mit/ohne Duplikate

#4

Beitrag von d'r Bastler »

Moin zusammen,

hatte ich im obigen Code noch den Kommentar Konstante erforderlich! geschrieben, habe ich diese Hürde inzwischen erfoglreich umgangen. Die folgende Sub Test zeigt wie man die Größe dynamischer Arrays auch per Variable steuern kann.

Code: Alles auswählen

Sub test()
Dim aTest(), i As Integer
For i = 4 To 16 Step 4
    ReDim aTest(i)
    MsgBox UBound(aTest)
Next i
End Sub
ReDim heisst das Zauberwort ;-)
d'r Bastler von den VBAsteleien.de
Win 10 + Office 2019 & Win11 + Office 2021 + Visio 2019 pro & macOS.X15 + Office2019pro & Android12 & XL365
Antworten

Wer ist online?

Mitglieder in diesem Forum: Ahrefs [Bot], Bing [Bot] und 0 Gäste