Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0469: Liste von Elementen zufällig mischen

 von 

Beschreibung 

Eine Liste mit 10000 Einträgen wird in windeseile komplett durcheinander gebracht. Dies geschieht nach einem raffinierten Trick: Es werden einfach zufällige Einträge der Liste miteinander vertauscht, was nach genügend Durchgängen den gewünschten Effekt bringt.

Schwierigkeitsgrad:

Schwierigkeitsgrad 1

Verwendete API-Aufrufe:

keine

Download:

Download des Beispielprojektes [2,66 KB]

'Dieser Quellcode stammt von http://www.activevb.de
'und kann frei verwendet werden. Für eventuelle Schäden
'wird nicht gehaftet.

'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
'Ansonsten viel Spaß und Erfolg mit diesem Source!

'------------- Anfang Projektdatei Projekt1.vbp -------------
'--------- Anfang Formular "Form1" alias Form1.frm  ---------
' Steuerelement: Textfeld "Text1"
' Steuerelement: Schaltfläche "Command2"
' Steuerelement: Schaltfläche "Command1"
' Steuerelement: Listen-Steuerelement "List1"
' Steuerelement: Beschriftungsfeld "Label2"

'Code von Benjamin Wilger
'Benjamin@ActiveVB.de
'Copyright (C) 2001

Option Explicit

Private Sub Command1_Click()
    Dim i As Long
    
    List1.Clear
    For i = 0 To Val(Text1.Text) - 1
        List1.AddItem "Testeintrag: " & i
    Next i
    
    Command2.Enabled = True
End Sub
Private Sub Command2_Click()
    RandomizeList List1
End Sub

Private Sub RandomizeList(LB As ListBox)
    Dim i As Long
    Dim b() As String, tmp As String
    Dim UB As Long, RndNum As Long
    Dim hWnd As Long
    
    hWnd = LB.hWnd
    UB = LB.ListCount - 1
    If UB < 0 Then
        Debug.Print "Aufgrund eines Bugs in der VB-Listbox ist es nicht " & _
                    "möglich, auf mehr als ca. 32000 Einträge zuzugreifen, " & _
                    "da die ListCount-Eigenschaft den Datentyp Integer hat. " & _
                    "Ab dieser Grenze ist der Listcount-Wert blöderweise " & _
                    "negativ! Unter Windows9x ist es noch nichteinmal möglich, " & _
                    "überhaupt mehr als 32000 Einträge einzufügen! Unter " & _
                    "Win2000 kann man sie zwar einfügen, aber nicht drauf zugreifen."
        Exit Sub
    End If
    
    'Liste in String-Array speichern, damit es schneller geht.
    ReDim b(0 To UB)
    For i = 0 To UB
        b(i) = LB.List(i)
    Next i
    
    Randomize Timer ' "Zufallsgenerator" anwerfen
    
    For i = 0 To UB
        'Aktuellen Wert mit einem zufällig ausgewählten vertauschen...
        'Wer penibel ist, der kann die folgenden zwei Zeilen wieder hinzufügen.
        'Dann werden nämlich nur Einträge zugelassen, die nicht dem aktuellen
        'Eintrag entsprechen. Ist aber etwas langsamer.
        
        'Do
            RndNum = Rnd * UB + 0.5
        'Loop Until RndNum <> i
        tmp = b(i)
        b(i) = b(RndNum)
        b(RndNum) = tmp
    Next i
    
    'Das ganze wieder zurückschreiben
    LB.Clear
    For i = 0 To UB
        LB.AddItem b(i)
    Next i
End Sub
'---------- Ende Formular "Form1" alias Form1.frm  ----------
'-------------- Ende Projektdatei Projekt1.vbp --------------

Tipp-Kompatibilität:

Windows/VB-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.