在Bash中随机均匀分布

时间:2017-07-29 02:23:57

标签: bash random

我一直在使用“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

结果如下:

 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命令,它可以/可以更均匀地分配随机结果吗?

2 个答案:

答案 0 :(得分:6)

回到高中的可能性。有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。

因此,您的结果仅反映了与完全随机数据的方差的微小差异。它作为&#34;偶数&#34;正如大自然所预测的那样。

您提供的信息非常有限的结论是,shuf正在按照其设计目标行事。

如果您希望某些歌曲不是纯粹随机出现,那么您可以设计一种比其他歌曲更喜欢某些歌曲的加权方案。一个非常简单的方法是将每首歌i放在W_i副本的原始列表中,其中W_i是所需的相对权重。然后洗牌。还有许多其他可能的方案。

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

答案 1 :(得分: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