2017-07-29 68 views
4

我一直在使用「shuf」和「sort -R」來隨機播放我的音樂播放列表,但感覺某些歌曲的播放比其他歌曲更多。在Bash中隨機分佈

爲了測試這個,我使用了下面的命令,將字母順序混合並在洗牌中記錄第一個字母,重複x1000,然後計算每個字母被選取的次數。如果是真正的隨機會有均勻分佈,但它總是一面倒:

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 

導致類似:

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 

通知「T」是如何選擇53次,但'W'只有29次。我相信我經常聽到的歌曲就像't',而且我很少聽到這些歌曲(比如'w')。

任何人都可以想出一個Bash/Perl/Python/etc命令,以便/可以更均勻地分發隨機結果嗎?

+1

......你要知道,我需要運行一些統計要知道你的結果(上面)實際上*是否反映了任何一種錯誤;他們確實不完全清楚。如果你跑了另一千,你是否有相同的字母有利和不利? –

+0

@BenjaminW。我認爲你是對的,但問題的標題和標籤是誤導性的。 – archemiro

+0

附註:不會'printf'%s \ n「{A..Z} {a..z} | nl -ba'是一種更簡單的方法來生成您的示例結果? –

回答

0

這給了我一個很好的分佈:

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

注意,當您增加樣本的大小,你得到更準確的結果:

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

但我真的不存在的東西是shuf有什麼問題,我試過這個:

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

回到高級sch ool概率。有26個分箱,任何分箱中物品k的分配數量應該是二項分配的(如果shuf正常工作):B(k; 1000,1/26)。這是在1000次試驗中k成功的概率,其中任何試驗的成功概率爲1/26。

二項式的方差Var = np(1 - p) = 1000(1/26)(25/26) =~ 37

你的結果有什麼不同?那是E(X^2) - (E(X))^2。您可以快速將數據插入Google表格或同等產品中。它是36.

所以你的結果只反映了完全隨機數據方差的微小差異。它與自然預測的一樣「平等」。

從您提供的非常有限的信息得出的結論是shuf正在完成它設計的目的。

如果您希望某些歌曲純粹是隨機出現的,您可以設計一種比其他人更喜歡某些歌曲的加權方案。一個非常簡單的方法是將每首歌曲i放在W_i副本的原始列表中,其中W_i是期望的相對權重。然後洗牌。還有許多其他可能的方案。

[這種東西就是爲什麼我有一個很好笑的肚子每當有人說數學不需要成爲一個計算機程序員。]

+0

Upvoted你的答案,因爲你的解釋比我的答案好得多,因爲沒有解釋爲什麼這裏沒有錯。毫無疑問,這是正確的答案。 – archemiro

+0

這樣做很有意義。感謝您的詳細解釋。你已經提供了數學和Archimiro提供的例子(感謝你們倆)。現在唯一的問題是,爲什麼我總是這樣*我覺得*就像洗牌一樣,對某些歌曲(我覺得我比其他人聽到的頻率更高)給予某種神祕的偏好。可能需要一位心理學家來回答這個問題。 – mdaddy

+1

@mdaddy想象隨機數據中的模式在數千年來一直是人類的瘟疫。你只是參加派對的最新人選。 ;-) – Gene