Linuchs: der Zufall mt_rand ist nicht zufällig genug

Moin,

wir kennen das alle, wenn wir bei "Mensch ärgere dich nicht" auf keinen Fall eine 2 würfeln wollen, kommt dreimal nacheinader die 2.

So auch bei meiner neuen Webseite, wo eigentlich bei jedem Aufruf "ganz zufällig" eine von z.Z. 15 neuen Hörprobe angeboten werden soll.

Ich nutze mt_rand um bei jedem Aufruf neu zu würfeln, doch - gefühlt - kommt fast immer die bereits zuvor angebotene Hörprobe. Ich kenne das von youtu.be, wo mir ja auch ständig die bereits gesehenen Videos angeboten werden. Ein Schmoren im eigenen Saft sozusagen.

Wer kennt dieses Problem und hat eine Idee zum gezielten Widerstand gegen den Zufall?

Linuchs

  1. Mach dir eine Statistik in der du die Werte abspeicherst, dann kannst du dir ansehen was da über die Zeit hinweg passiert.

    Bei Webseiten, also bei Aufrufen die nicht 10.000 mal pro Sekunde passieren sondern im Sekundentakt oder noch langsamer, genügt dir vielleicht auch die aktuelle Zeit als Zufall. time() % anzahl
    Oder microtime().

  2. Hallo

    Das Problem tritt bei allen einzelnen Zufallsereignissen auf und ist ganz normal. Sonst wäre es kein Zufall mehr.

    der Zufall mt_rand ist nicht zufällig genug

    Der übliche Logikfehler.

    Dieser Ansatz ist falsch. Du willst doch genau das Gegenteil, den Zufall einschränken. Die Ereignisse sollen gleichmäßig auftreten, aber innerhalb der Gleichmäßigkeit in zufälliger Reihenfolge.

    Und genau das ist die Lösung. Du schmeißt gezinkte Würfel in einen Sack. Einer, der nur Einsen anzeigt, einer der nur Zweien anzeigt und so weiter. Praktischer statt der Würfel ist natürlich etwas, was man sowieso im Haus hat, aber darum geht es in der Erläuterung nicht.

    Dann läßt du einen nach dem anderen ziehen. Wenn alle gezogen sind wieder von vorne. So wird die Zufälligkeit, dass eine Zahl öfter als eine andere gezogen wird, ausgeschaltet. Die Reihenfolge der Zahlen untereinander bleibt aber zufällig.

    Übertragen auf dein Problem: Du erstellst eine Abspielliste mit allen Liedern und gibst denen eine zufällige Reihenfolge. Wenn die abgespielt ist wird die Reihefolge erneut in eine zufällige Reihenfolge gebracht und alle Lieder werden abgespielt.

    Du kannst noch weitere Zufallskiller einbauen, um die Lieder zufällig, aber gleichmäßig abzuspielen.

    Zum Beispiel die Lieder innerhalb der Abspielliste in Blöcke aufteilen. Die Anzahl der Blöcke hängt von der Anzahl der Lieder ab, jeder Block sollte mehrere Lieder enthalten. Bei sechzig Liedern könnten die Lieder auf sechs Blöcke verteilt werden.

    Nach dem ersten Durchlauf aller Lieder werden die Blöcke um eine Position verschoben und die Lieder nur innerhalb der Blöcke neu sortiert. So werden die Lieder immer in einem gewissen Abstand voneinander gespielt. Bei sechs Blöcken werden die Lieder so sechs mal abgespielt. Danach ist wieder der erste Block vorne, die Lieder werden komplett neu auf die Blöcke verteilt und es geht wieder los.

    Gruss

    MrMurphy

    1. Tach!

      Dieser Ansatz ist falsch. Du willst doch genau das Gegenteil, den Zufall einschränken. Die Ereignisse sollen gleichmäßig auftreten, aber innerhalb der Gleichmäßigkeit in zufälliger Reihenfolge.

      Für die genannten Verfahren der einfacheren Sorte bietet sich unter anderem ein Array an, dass man schüttelt und dann gerade durchläuft. Oder per Zufall ein Element wählen und das dann entfernen, bis alle weg sind, und das Array dann wieder füllen.

      dedlfix.

    2. Hallo MrMurphy,

      erstmal danke für die ausführliche Erläuterung.

      Mein "Logigfehler" war wohl eher ein Mißverständnis. Beim "zufälligen" Abspielen von Liedern kommt bei meinem CD-Player keinesfalls ein Lied der Liste doppelt vor.

      Auf die Schnelle habe ich mir einen Counter angelegt und nudel den immer wieder durch. Besser als doppeltes Abspielen.

      Vielleicht sollte ich die abgespielten Positionen merken und nur unter den übrigen losen. Wenn kein Lied mehr übrig ist, wird die Merkliste gelöscht.

      Aber deine Ausführung lese ich noch mal in Ruhe durch.

      Linuchs

      1. Hallo Linuchs,

        Mein "Logigfehler" war wohl eher ein Mißverständnis. Beim "zufälligen" Abspielen von Liedern kommt bei meinem CD-Player keinesfalls ein Lied der Liste doppelt vor.

        Weil der das genau so macht, wie es MrMurphy1 beschreibt.

        Auf die Schnelle habe ich mir einen Counter angelegt und nudel den immer wieder durch. Besser als doppeltes Abspielen.

        Vielleicht sollte ich die abgespielten Positionen merken und nur unter den übrigen losen. Wenn kein Lied mehr übrig ist, wird die Merkliste gelöscht.

        Du solltest es so machen, wie dedlfix es vorschlägt.

        Bis demnächst
        Matthias

        --
        Dieses Forum nutzt Markdown. Im Wiki erhalten Sie Hilfe bei der Formatierung Ihrer Beiträge.
  3. Hallo und guten Morgen,

    Ich nutze mt_rand um bei jedem Aufruf neu zu würfeln, doch - gefühlt - kommt fast immer die bereits zuvor angebotene Hörprobe. Ich kenne das von youtu.be, wo mir ja auch ständig die bereits gesehenen Videos angeboten werden. Ein Schmoren im eigenen Saft sozusagen.

    Da gabs mal was: Changer

    Grüße
    TS

    --
    es wachse der Freifunk
    http://freifunk-oberharz.de
    1. Hallo TS!

      Da gabs mal was: Changer

      Hättest du Lust, den Artikel fertigzustellen und ihn in dann wieder in den Anwendung und Praxis-Bereich zu verschieben?

      Grüße
      TS

      Herzliche Grüße

      Matthias Scharwies

      --
      Es gibt viel zu tun - packen wir's an: ToDo-Liste gewünschte Seiten