Aus einer Auswahl zufällig etwas wählen, aber immer eine andere Wahl, bis alles einmal gewählt wurde

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • Also, wenn man jetzt die einzelnen bits der 400 bytes den mp3s zuordnet und immer beim Abspielen dieses zugeordnete bit resettet und bei der nächsten Wahl nach dem Würfeln kontrolliert, ob das nun ausgewählte bit noch 1 ist, dann kann sich die Wahl gegen Ende doch recht hinziehen. Es wird ja immer wahrscheinlicher, dass man ein schon gespieltes Stück erwischt. Alles nicht so einfach, zumindest bei vielen Dateien. Vielleicht wäre es am einfachsten, wenn ich beim zwangsweisen Umbenennen, die Sammlung auch gleich mische und dann einfach der Reihe nach abspiele.
      Es gibt ja im Programm noch mehr Stellen, wo zufällige Texte gewählt werden, allerdings wird hier die Auswahl nicht so groß sein. Da kann ich dann im Kleinen die 'zufällige, gesamte Auswahl' probieren, nach der Idee von @Pluto25.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Muss der Anwender nicht eine Taste drücken oder so etwas?
      Du könntest beim ersten Start eine Variable hochzählen, bis der Anwender eine "Start Taste" drückt und den Wert dann für Randomize() nehmen.

      Am besten hat mir aber deine Idee gefallen, alles vorher zu mischen und dann einfach in Reihenfolge abzuspielen. Der gespielte Titel wird im EERam gesichert, so geht es immer der Reihe nach.
      Also zumindest ich hätte Titel 1 vergessen, nachdem ich weitere 2999 gehört habe :D
      Code first, think later - Natural programmer :D
    • Ich hab' einen ständig laufenden 1 Sekunden-timer, da hab' ich
      incr __rseed drin (hab' ich bei @Zitronenfalter abgeschaut)
      Das Mischen der Witze ist für mich jetzt gelöst, wird eben vorher gemacht. Gut. Was mich jetzt noch umtreibt, sind die anderen zufällig gewählten Textbausteine. Die gibt es beim Aufwachen, bei der Info, welche Zeit eingestellt ist, beim Starten des countdowns, bei der Info über die Restlaufzeit, beim Drücken von aktuell funktionslosen Tasten, beim Stoppen vom countdown...also so um die 10 Stellen im Programm. Ich dachte, ich könnte das schön anwenderfreundlich gestalten, dass das Programm die jeweils einzelnen Varianten zählt und dann mit dieser Erkenntnis eine zufällige, alles wählende Routine bastelt. Dann könnte ich einfach jederzeit zusätzliche Varianten (files) auf die sdcard spielen und der Rest geht automatisch. Wenn ich aber dabei arrays verwenden will, hm, dann muss ich mir die maximale Anzahl vorher ausdenken und entsprechen große arrays anlegen. Alles so kompliziert, oder vielleicht hab' ich doch Fieber...
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Vergesst jetzt die Witz-mp3s, das sehe ich als erledigt an. Worum es jetzt geht: der Küchentimer ist im powerdown. Ich drücke eine beliebige Taste, der AVR erwacht und gibt eine Begrüßung aus. Dieser Begrüßungssatz soll natürlich nicht immer derselbe sein, also gibt es da Varianten, die zufällig verwendet werden. Da der Ordner ja bis zu 255 files speichern kann, könnte man soviele Varianten anlegen. Mir fallen aber aktuell nicht so viele ein und so dachte ich, das Programm so zu gestalten, dass man ohne Programmänderung irgendwann einfach neue Varianten in den Ordner kopiert und das Programm richtet sich auf die zusätzlichen Varianten ein. Das wäre mein Wunsch. Aber wenn die Anzahl der Varianten die Größe des arrays bestimmt, geht das nicht automatisch, sondern man muss das Programm händisch anpassen und neu flashen.
      Und Babette sagt ja zu jeder Aktion was und je mehr Varianten zu jeder Aktion, umso schöner/lustiger ist das Ganze. (denke ich)
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • das hätte ich dann nach dem Tausch der sdcard mit einem internen Taster ausgelöst. Ich lade grad' ein Filmchen hoch, dann ist es vielleicht leichter zu verstehen, was ich meine.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • stefanhamburg schrieb:

      „Ich hab' einen ständig laufenden 1 Sekunden-timer, da hab' ich
      incr __rseed drin „
      Das macht den rnd m.E. auch nicht zufälliger.
      Da wirst du Recht haben. Aber, da ich nicht immer zur gleichen Zeit auf eine Taste drücke, die eine zufällige Aktion auslöst, wird es kein wiederkehrendes Muster geben. Insofern glaube ich, dass das schon was bringt. Anders gedacht, hätte ich diese Zeile nicht im timer, wäre es auch egal, weil die rnd()-Funktion nicht neu gestartet wird, der Kontroller ist ja im powerdown und nicht abgeschaltet. Die Variablen bleiben ja alle erhalten.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Zitronenfalter schrieb:

      Und wenn das Array auf die maximal mögliche Größe dimensioniert wird aber nur abhängig von der Dateianzahl verarbeitet wird?
      Darauf läuft es jetzt hinaus.

      Jetzt, O-Ton von Babette.
      Im Prinzip sollte jede Kommentierung von Babette Varianten enthalten, außer bei dem Setzen der Zeit. Beim Alarm sollte es natürlich möglichst viele verschiedene geben, was aber relativ einfach ist. Da kann man ja viel nehmen, Jaghorn, Kirchenglocken, 'time' von Pink Floyd...

      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Der code zum Film, die sdcard ist auch als zip zu groß. Wenn es ja schon jemand will, dann würde ich die auf dropbox hochladen
      Dateien
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Hi, ich weiß, ich bin etwas spät dran... Aber das Anfangsproblem mit der zufälligen Auswahl eines Elements aus einer Liste, fand ich schon interessant...

      tschoeatsch schrieb:

      Also, wenn man jetzt die einzelnen bits der 400 bytes den mp3s zuordnet und immer beim Abspielen dieses zugeordnete bit resettet und bei der nächsten Wahl nach dem Würfeln kontrolliert, ob das nun ausgewählte bit noch 1 ist, dann kann sich die Wahl gegen Ende doch recht hinziehen. Es wird ja immer wahrscheinlicher, dass man ein schon gespieltes Stück erwischt. [..]
      Als Lösungsansatz möchte ich das Prinzip der "Verketteten Liste" vorschlagen.

      Ein Listenelement hat dabei zwei Eigenschaften:
      - Wert
      - Zeiger auf das Nachfolgeelement

      Konkret für deine Anwendung hieße das, du erstellst ein Array mit 4000 Elementen aus word-Variablen. Der Array-Index (0..3999) ist dabei gleichzeitig der Wert des Elements. Die word-Variable ist dann der Zeiger auf den Nachfolger. Das letzte Element kann ja wieder auf der erste, Index 0, zeigen.

      Im Startzustand hast du dann ein Array:
      Index word-Variable
      0 1
      1 2
      2 3
      .
      .
      3998 3999
      3999 0

      Zur einmaligen Auswahl eines beliebigen Elements aus der Liste generierst du eine Zufallszahl im Bereich der gültigen Indexe, also zunächst beim Start zwischen 0 und 3999.
      Dieses per Zufall ausgewählte Element muss nun aus der Liste gelöscht werden. Die entstandene Lücke muss durch "Aufrücken" aller Listenelemente hinter dem gelöschten Element gefüllt werden. Der größte gültige Listenindex muß nach jedem Löschen eines Listenelements natürlich um 1 verringert werden, da die maximale Anzahl an gültigen Indexen sich ja verkleinert hat.

      Beispiel: Per Zufall wählst du Element 42

      Index word-Variable
      41 42
      42 43 (Wird aus Liste gelöscht..)
      43 44
      44 45
      .
      .
      3999 0

      Neue Liste nach Löschen von Element 42 und Aufrücken von hinten:

      41 42
      42 44
      43 45
      44 46
      .
      .
      3998 0

      Zur Auswahl des nächsten beliebigen Listenelements wieder eine Zufallszahl aus dem Bereich der gültigen Indexe generieren, d.h. jetzt aus dem Bereich 0..3998.

      Dieses Aufrücken der Listenelemente hinter dem selektierten ist zwar auch ein gewisser Aufwand, der jedes mal durchgeführt werden muss, aber er ist terministisch. Im Gegensatz zum oben zitierten Problem wird der Aufwand sogar mit zunehmender Anzahl bereits abgespielter Indexe kleiner.

      Grüße
      KH

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Klaus Heissler ()

    • @Klaus Heissler danke, für deine gut beschriebene Idee. Die gleiche kam von @Pluto25 im post#3, nur etwas schwammiger formuliert ^^
      Das Verfahren ist ja auch ganz gut, nur rechne mal den ram-Bedarf dafür aus. Dann bräuchte ich AVRs, die wegen dem pin-Abstand schon blöd zu verarbeiten sind (für mich zumindest)
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • tschoeatsch schrieb:

      rechne mal den ram-Bedarf dafür aus
      Wenn die Daten auf einer Sd sind könnte vielleicht die ausgewählte nach dem Abspielen in ein anderes Verzeichnis geschoben werden und dann die Auswahl mit der veringerten Dateianzahl wiederholt werden.
      Als Auswahlkriterium dann nicht der Dateiname sondern der "Dateicount"
      Damit wäre kein Array mehr nötig.
      Wenn alle ausgewählt wurden einfach die Verzeichnissnamen tauschen und wieder von vorn.
    • Ich hab' doch kein dos laufen und somit keinen direkten Zugriff auf die sdcard. Selbst mit dos käme ich nicht dahin, auf der card sitz der player.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------