![]() |
Shuffle algo
Meine Shuffle function
Delphi-Quellcode:
Wie kann man diesen verbessern so das nicht so oft immer wieder der 1 Listeintrag abgespielt wird?
{$REGION 'function ListShuffle'}
function TBassPlayer.ListShuffle(LView: ISkinListView): Integer; var Inx: Integer; RandomInx: Integer; RandomIndex: Integer; ListCount: Integer; begin RandomIndex := 0; result := 0; ListCount := LView.Count(LView.Handle); for Inx := 0 to ListCount - 1 do begin begin RandomInx := Random(ListCount); if (RandomInx <> Inx) then RandomIndex := RandomInx; end; if RandomIndex = LView.GetCurSel(LView.Handle) then RandomIndex := RandomIndex + 1; result := RandomIndex; end; end; {$ENDREGION} Heino nervt langsam.. ;) gruss |
AW: Shuffle algo
Zitat:
Delphi-Quellcode:
RandomInx := Random(ListCount);
if (RandomInx <> Inx) then begin result := RandomInx; exit; end; |
AW: Shuffle algo
Zitat:
Muss mir das noch mal anschauen. Der Witz an meiner schleife ist dieser das einmal der Index und zusätzlich die gesamte Liste geändert werden soll um eine höhere Wahrscheinlichkeit zu haben das sich die Einträge nicht widerholen. So rufe ich sie auf.
Delphi-Quellcode:
Mein Problem ist das der 1 Eintrag zu oft aufgerufen wird.gG.ShuffelIndex := BassPlayer.ListShuffle(LVPlayFav); LVPlayFav.ListViewSelect(LVPlayFav.Handle, gG.ShuffelIndex); PS: So sollte das sein.
Delphi-Quellcode:
Muss mal sehen ob das ausreicht.
function TBassPlayer.ListShuffle(LView: ISkinListView): Integer;
var Inx: Integer; RandomInx: Integer; RandomIndex: Integer; ListCount: Integer; begin RandomIndex := 0; result := 0; ListCount := LView.Count(LView.Handle); for Inx := 0 to ListCount - 1 do begin begin RandomInx := Random(ListCount); if (RandomInx <> Inx) then begin RandomIndex := RandomInx; LView.SetTopItem(LView.Handle, RandomIndex) end; end; if RandomIndex = LView.GetCurSel(LView.Handle) then begin RandomIndex := RandomIndex + 1; LView.SetTopItem(LView.Handle, RandomIndex); end; result := RandomIndex; end; end; gruss |
AW: Shuffle algo
Wenn das die Absicht ist, empfehle ich dir das Fisher-Yates-Verfahren:
![]() Das lässt sich leicht auch falsch implementieren (Beachte, ob die Zufallszahlen inklusive oder exklusive der Grenze sind!) liefert aber mit einer guten Zufallsquelle eine völlig zufällige Permutation. Wenn das Random() mittels
Delphi-Quellcode:
für ein beliebiges n errechnet wird, hast du jedoch bereits eine leichte Ungleichverteilung.
Random(maxint) modulo n
|
AW: Shuffle algo
Zitat:
Sorry bin kein Mathematiker. :) Und ja die Liste soll verändert werden das erhöht den Zufallsgenerator. gruss |
AW: Shuffle algo
Zitat:
![]() ![]() Zitat:
VG J |
AW: Shuffle algo
Eventuell wäre das ein Ansatz:
![]() |
AW: Shuffle algo
Zitat:
Zitat:
gruss |
AW: Shuffle algo
Hallo EWeiss,
vielleicht nicht die eleganteste Art und Weise, aber gut nachzuvollziehen. So als Gedenkstütze in Pseudocode. Das Prinzip sollte klar sein...
Delphi-Quellcode:
var PlayList : TObjectList<SongItems>
PlayListShuffled : TObjectList<SongItems> CurrentIdx : Integer; i : Integer; begin [...] for i := 0 to PlayList.Count-1 do begin CurrentIdx := Random(PlayList.Count-1); PlayListShuffled.AddItem(PlayList[CurrentIdx]); PlayList.Delete(CurrentIdx); end; [...] Viel Erfolg. |
AW: Shuffle algo
Zitat:
Muss es testen .. Danke schön für deinen Beitrag.. jetzt kann ich alle varianten testen :) gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:48 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz