"Zufall" im Hörspielmodus verbessern

Das geht alternativ auch ohne Konsole über die Ansage der Tracknummer (lange Play drücken). Grundsätzlich kann ich deinen Eindruck aber bestätigen. Ich bekomme zum Einschlafen auch einige Tracks häufiger als andere.

Hallo Stefan,

letztlich zeigt dass das Kernproblem. Wenn ich bei jedem Aufruf (neue Karte), die Tracks pseudomäßig neu durchwürfel, kann es Prinzip bedingt auch immer zu Wiederholungen kommen. Das nervt, auch wenn, dass was sich wiederholt zufällig ist.
Auch hier sehe ich in der Queue den besten Ansatz. Ich bin noch nicht ganz Firm im DF-Player. Mal angenommen in jedem Ordner können bis zu 255 Dateien liegen.
Man würfelt nach dem Hochlauf einmal ein Array mit den Zahlen von 1 bis 255 in einer Schleife durcheinander. Dabei man in jedem Schleifendurchlauf zwei Zahlen gegeneinander und die Zielposition der Zahl kann man sogar mit randomseed und random und dem AI Trick noch pseudozufällig platzieren.
Man erhält so eine Zufallsfolge, in der jeder Wert einmal vorkommt, ohne Wiederholungen.
Und jetzt ist es eigentlich egal, in welchem Modus ich einen Zufallstrack anfordere, wir nehmen bei jeder Anforderung einfach die nächste Zahl im Array.
Also:

  • Generierung des Arrays bei Hochlauf, oder erster Anforderung
  • Bei jeder neuen Anforderung um eins im Array weiter rücken
  • Prüfen, ob die dort hinterlegte Nummer als Track verfügbar ist.
  • Wenn Ja: Starten wir den Track
  • Wenn Nein: Nehmen wir so lange die nächste, bis wir Treffen.
  • Kommen wir am Ende des Arrays an, wird neu gemischt.

So sind Wiederholungen prinzipiell ausgeschossen. Und wir müssen auch nur alle 255 Aufrufe neue mischen. Und weil der Zufall nicht vom Spielmodus abhängt, kann man die Zufallsserie unabhängig vom Spielmodus weiter verwenden.

Noch ein paar Ansätze zur Verbesserung der Zufälligkeit
@Thomas-Lehnert hatte die fehlende Amplitude des AI angesprochen. Letztlich rauscht vermutlich sowieso nur da LSB annähernd zufällig.
Ich würde daher nicht die Amplitude auswerten, sondern lediglich das LSB in einer Schleife mit 16 Zyklen auslesen und in einen Integer rein schiften. So wird quasi in jedem Zyklus ein Bit der 16 Bit Variable definiert.

Als weiteren Ansatz könnte man die randomseed auch über die Zeitdifferenz zwischen zwei Bedienhandlungen oder die Länge des letzten Tastendrucks bestimmen.
Oder man mischt alle drei zusammen.

Mir ist noch eingefallen, daß wir dieses Thema Ende 2019 schon mal hatten. Schaut euch mal diese Beiträge von @Peer an:

Eventuell könntet ihr euch davon inspirieren lassen…

1 „Gefällt mir“

Hallo zusammen,
ich habe das mit einer Änderung im Code relativ einfach umgesetzt. Beim ersten Auflegen einer neuen Karte werden alle Tracks per Zufall gemischt (mit der Standard Routine). Dann wird der erste Track in der Liste abgespielt. Drückt man weiter oder legt dieselbe Karte erneut auf, dann wird der nächste Track in der Liste gespielt. Unterschied zwischen Hörspiel und Partymodus ist jetzt nur, dass im Partymodus automatisch der nächste Track in der Liste gespielt wird, im Hörspielmodus nicht.
Die Qualität der Zufallsgenerierung ist doch dabei relativ egal, da sichergestellt ist, dass die Liste komplett abgearbeitet wird. Damit kann auch bis zum Ende der Liste kein Track doppelt kommen.
Bin damit jetzt glücklich und meine Tochter auch :slight_smile:
Grüße
John

Das klingt auch gut.
Ich komme leider weder zu einer soft-, noch Hardwarelösung.

Heute habe ich mir die Zeit genommen meine Variante zu bauen.
Ich finde sie für mich nachvollziehbarer, deshalb habe ich die genommen.
Und ich hatte Erfolg.
Also wer mir folgen möchte:
Meine Überlegung:
Ich erzeuge mir einen Zufall, indem ich „millis()“ (also der aktuellen Laufzeit des Arduino in Millisekunden) durch die Anzahl der Tracks im Ordner teile, und der Rest dieser Division ist dann mein Zufall. Dies wechselt dann also im Millisekundentakt und je nachdem wann ich die Karte dran halte, spielt er mir diesen Track.

Änderungen in der originalen TonUINO Version 2.1:

Zeile 865 von
currentTrack = random(1, numTracksInFolder + 1);
nach
currentTrack = 1 + ( millis() % (numTracksInFolder + 1 ));

und Zeile 907 von
currentTrack = random(myFolder->special, numTracksInFolder + 1);
nach
currentTrack = myFolder->special + ( millis() % (myFolder->special2 - myFolder->special + 1 ));
ändern.

2 „Gefällt mir“