在Bash中随机均匀分布

mda*_*ddy 4 random bash

我一直在使用"shuf"和"sort -R"来改变我的音乐播放列表,但感觉某些歌曲比其他歌曲播放得更多.

为了测试这一点,我使用了以下命令,它将字母表混洗并记录随机播放的第一个字母,重复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
Run Code Online (Sandbox Code Playgroud)

结果如下:

 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
Run Code Online (Sandbox Code Playgroud)

请注意't'被选中53次,但'w'只有29次.我相信我经常听到的歌曲就像't',并且我很少混音(比如'w').

任何人都可以提出一个Bash/Perl/Python/etc命令,它可以/可以更均匀地分配随机结果吗?

Gen*_*ene 6

回到高中概率.使用26个箱子,k任何箱子中物品数量的分布应该是二项式(如果shuf工作正常):B(k; 1000,1/26).这是k在1000次试验中成功的概率,其中任何试验的成功概率为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.然后洗牌.还有许多其他可能的方案.

[这种事情就是为什么每当有人说数学不需要成为计算机程序员时我就会笑得很开心.]