在Bash中随机均匀分布
我一直在使用“shuf”和“sort -R”来改变我的音乐播放列表,但感觉某些歌曲比其他歌曲播放得更多.
为了测试这个,我使用了以下命令,它将字母表混洗并在随机播放中记录第一个字母,重复x1000,然后计算每个字母被选中的次数.如果它是真正随机的,那么会有均匀的分布,但它总是不平衡的: printf "anbncndnenfngnhninjnknlnmnnnonpnqnrnsntnunvnwnxnynz" > 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 结果如下:
请注意’t’被选中53次,但’w’只有29次.我相信我经常听到的歌曲就像’t’,并且我很少混音(比如’w’). 任何人都可以提出一个Bash / Perl / Python / etc命令,它可以/可以更均匀地分配随机结果吗? 解决方法
回到高中概率.使用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正在完成它的设计目的. 如果您希望某些歌曲不是纯粹随机出现,那么您可以设计一种比其他歌曲更喜欢某些歌曲的加权方案.一个非常简单的方法是将每首歌曲放在原始列表中的W_i副本中,其中W_i是所需的相对权重.然后洗牌.还有许多其他可能的方案. [这种事情就是为什么每当有人说数学不需要成为计算机程序员时我都会笑得很开心.] (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |