VB 5/6-Tipp 0469: Liste von Elementen zufällig mischen
von Benjamin Wilger
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: | Verwendete API-Aufrufe: keine | Download: |
'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-Version | Win32s | Win95 | Win98 | WinME | WinNT4 | Win2000 | WinXP |
VB4 | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
VB5 | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
VB6 | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
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.