Zahlen aus definierten Bereich mit Random ausgeben (jedes Element nur einmal)

JoKne

Erfahrenes Mitglied
Ich hab keine Ahnung wie ich es nennen soll und habe deshalb diese
seltsame Überschrift gewählt. Tut mir leid wenn ich gegen die Netiquette
verstoße, mir ist aber nicht besseres eingefallen.

Zu meinem Problem:

Ich habe eine Listbox, das erste element ist 0 das letzte dadurch dann immer List1.Listcount - 1.

Listcount gibt die Anzahl der EInträge in der Liste wieder, da die Liste bei 0 beginnt List1.listcount - 1.
Ich möchte später Einträge aus der Liste mit List2.List(x) als string ausgeben,wobei x dann für
das Element aus der Liste zwischen 0 und List1.Listcount-1 steht.

Mein Problem, ich schaffe es nicht genau aus diesem Bereich jedes Element
nur einmal auszugeben. Sagen wir bei 20 Elementen in der Liste die Elemente
von 0-19 in zufälliger Reihenfolge (random) und jedes Element nur einmal auszugeben.

Hat einer von euch eine Idee wie man das realisieren könnte?

Bin für jede Antwort dankbar ;-)
 
Versuch´s mal hiermit:
Code:
Dim Einträge(20) As Integer

Private Sub Zufall()
Dim Ziehung As Integer
Dim i As Integer
Dim Result As Boolean
Dim Zahl As Integer

Erase Einträge

Randomize -Timer

Ziehung = 0
While Ziehung < 20
  Ziehung = Ziehung + 1
  Do
    Zahl = Int(20 * Rnd + 1)
    Result = True
    For i = 1 To Ziehung - 1
      If Einträge(i) = Zahl Then
        Result = False: Exit For
      End If
    Next i
  Loop Until Result = True
  Einträge(Ziehung) = Zahl
Wend
End Sub

Private Sub Command1_Click()
Dim N As Integer
Call Zufall
List2.Clear
For N = 1 To UBound(Einträge)
List2.AddItem List1.List(Einträge(N) - 1)
Next
End Sub

Private Sub Form_Load()
Dim N As Integer
List1.Clear
For N = 0 To 19
List1.AddItem "Nummer " & Str(N)
Next
End Sub
 
Das ist nicht ganz das was ich brauche.

Vielleicht hab ich mich schlecht augedrückt.
Ich brauche eine Funktion oder eine Formel mit der es mir möglich
ist eine Zahl aus einem voher defiinierten Bereich auszugeben.
Also z.B zwischen 0 und 20 immer eine Zahl die erst doppelt vorkommen
darf wenn bereits alle zahlen von 0-20 vorgekommen sind^^.

Hab versucht den Code umzuschreiben, hat aber nicht ganz funktioniert.
Vielleicht schaffe ich es ja noch, noch bin ich jedoch nicht am Zielt ;-)

Bin also weiterhin für alle Antworten dankbar ;-)
 
Vielleicht habe ich dich ja richtig verstanden ;)
Code:
Private Function NächsteZufallszahl() As Integer

    Const MAXIMUM As Integer = 20
    Const MINIMUM As Integer = 0
    Const TRENNZEICHEN As String = ";"
    
    Static strVerwendet As String
    Static intAnzahlVerwendet As Integer
    
    Dim intMaximum As Integer
    intMaximum = MAXIMUM + 1 - intAnzahlVerwendet
    
    NächsteZufallszahl = Round(Rnd * intMaximum)
    
    While InStr(1, strVerwendet, TRENNZEICHEN & NächsteZufallszahl & TRENNZEICHEN, vbTextCompare) <> 0
        NächsteZufallszahl = NächsteZufallszahl + 1
        If NächsteZufallszahl = MAXIMUM + 1 Then NächsteZufallszahl = MINIMUM
    Wend
    
    strVerwendet = strVerwendet & TRENNZEICHEN & NächsteZufallszahl & TRENNZEICHEN
    intAnzahlVerwendet = intAnzahlVerwendet + 1
    
    If intAnzahlVerwendet = MAXIMUM + 1 Then
        '-->Alle Zahlen von MINIMUM bis MAXIMUM ausgegeben!
        intAnzahlVerwendet = MINIMUM
        strVerwendet = ""
        Randomize
    End If
End Function

Private Sub Form_Load()
    Randomize
End Sub

Funktion aufrufen:
Code:
MsgBox NächsteZufallszahl
 
Zuletzt bearbeitet:
Perfekt, genau das meinte ich. Einfach super, könnte nicht besser sein ;-).
Vielen Dank, hab ewig rumgetüffelt und zwar einige Annäherungen geschafft, aber so soll und muss es sein :)

Danke!
 
Zurück