2017-07-29 9 views
4

Ich habe "shuf" und "sort -R" verwendet, um meine Musik-Playlist zu mischen, aber es fühlt sich an, als würden bestimmte Songs mehr gespielt als andere.Gleichmäßig verteilt zufällig in Bash

Um dies zu testen, habe ich den folgenden Befehl verwendet, der das Alphabet mischt und den ersten Buchstaben im Shuffle aufzeichnet, wiederholt x1000 und zählt dann die Anzahl der Male, die jeder Buchstabe ausgewählt wurde. Wenn es wirklich zufällig gab es wäre eine gleichmäßige Verteilung sein, aber es ist immer schiefes:

printf "a\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nm\nn\no\np\nq\nr\ns\nt\nu\nv\nw\nx\ny\nz" > alphabet.txt; for i in {1..1000}; do cat alphabet.txt | perl -MList::Util=shuffle -e 'print shuffle(<STDIN>);' | perl -e 'print reverse <>' | head -1 >> results.txt; done; sort results.txt | uniq -c | sort; rm results.txt; rm alphabet.txt 

, die in etwas Ergebnisse wie:

29 w 
30 u 
31 d 
32 i 
33 v 
34 c 
34 m 
36 a 
36 g 
36 k 
36 n 
36 r 
36 z 
38 y 
39 x 
40 b 
40 e 
40 o 
42 p 
43 f 
43 h 
43 s 
44 j 
44 l 
52 q 
53 t 

Beachten Sie, wie ‚t‘ ausgewählt wurde 53 mal, aber "w" nur 29. Ich glaube, die Lieder, die ich am häufigsten höre, sind wie das "t", und es gibt Songs, die ich selten im Mix finde (wie das "w").

Kann jemand mit einem Bash/Perl/Python/etc Befehl kommen, der die zufälligen Ergebnisse gleichmäßig verteilen würde?

+1

... Wohlgemerkt, ich einige Statistiken laufen bräuchten zu wissen, ob deine Ergebnisse (oben) tatsächlich * irgendeine Art von Bug * widerspiegeln; es ist nicht klar, dass sie es tun.Wenn Sie noch einmal tausend laufen, haben Sie die gleichen Buchstaben bevorzugt und benachteiligt? –

+0

@BenjaminW. Ich denke, Sie haben recht, aber dann sind der Titel der Frage und die Tags irreführend. – archemiro

+0

Randnotiz: Wäre nicht "printf"% s \ n "{A..Z} {a..z} | nl -ba' eine einfachere Möglichkeit, Ihre Beispielergebnisse zu generieren? –

Antwort

0

Diese geben Sie mir eine schöne Verteilung:

cat /dev/urandom | tr -dc a-z | head -c 1000 | grep -o . | sort | uniq -c 

Beachten Sie, dass wenn Sie die Größe der Probe erhöhen Sie ein genaueres Ergebnis erhalten:

cat /dev/urandom | tr -dc a-z | head -c 1000000 | grep -o . | sort | uniq -c 

Aber ich weiß nicht wirklich, was es ist alles falsch mit shuf, versuchte ich dies:

for i in {1..1000};do printf "%s\n" {a..z} | shuf -n1 ;done | sort | uniq -c 
6

Gehen Sie zurück zu High sch ool Wahrscheinlichkeit. Bei 26 Bins sollte die Verteilung der Anzahl der Items k in einem beliebigen Bin binär sein (wenn shuf richtig funktioniert): B (k; 1000, 1/26). Das ist die Wahrscheinlichkeit von k Erfolgen in 1000 Studien, bei denen die Erfolgswahrscheinlichkeit bei jedem Versuch bei 1/26 liegt.

Die Varianz des Binoms Var = np(1 - p) = 1000(1/26)(25/26) =~ 37.

Nun, was ist die Varianz Ihres Ergebnisses? Das ist E(X^2) - (E(X))^2. Sie können die Daten schnell in ein Google-Blatt oder ein gleichwertiges Format einbetten. Es ist 36.

Ihr Ergebnis spiegelt nur einen winzigen Unterschied von der Varianz der vollkommen zufälligen Daten wider. Es ist so "gerade" wie es die Natur voraussagt.

Die Schlussfolgerung aus den sehr begrenzten Informationen, die Sie zur Verfügung gestellt haben, ist, dass shuf genau das tut, wozu es entwickelt wurde.

Wenn Sie möchten, dass bestimmte Titel nicht nur zufällig wiedergegeben werden, können Sie ein Gewichtungsschema erstellen, das einige Titel anderen vorzieht. Ein wirklich einfacher Weg ist, jedes Lied i in die ursprüngliche Liste in W_i Kopien, wo W_i ist das gewünschte relative Gewicht. Dann mischen. Es gibt viele andere mögliche Schemata.

[Diese Art der Sache ist, warum ich einen guter Bauch jedes Mal, Mathe ein Computer-Programmierer sein, nicht jemand sagt, lachst benötigt wird.]

+0

Upvoted Ihre Antwort als Ihre Erklärung ist viel besser als meine Antwort, die keine Erklärung gab, warum hier nichts falsch ist. Kein Zweifel, das ist die richtige Antwort. – archemiro

+0

Das macht Sinn. Danke für die gründliche Erklärung. Sie haben die Mathematik zur Verfügung gestellt und Archimiro hat die Beispiele zur Verfügung gestellt (danke an Sie beide). Jetzt ist die einzige Frage, warum ich immer * fühle * wie Shuffle eine Art geheimnisvolle Vorliebe auf bestimmte Lieder setzt (die, die ich fühle, als höre ich öfter als andere). Wahrscheinlich brauchen Sie einen Psychologen, der das beantwortet. – mdaddy

+1

@mdaddy Die Vorstellung von Mustern in zufälligen Daten ist seit Jahrtausenden eine Plage für die Menschheit. Du bist der letzte Typ, der zur Party kommt. ;-) – Gene

Verwandte Themen