【发布时间】:2019-03-07 01:37:02
【问题描述】:
我收藏了数百张黑胶唱片,按目录 ID 字符串按字母数字排列。我编写了一个脚本,通过对目录 ID 的打乱数组进行采样,从我的收藏中随机选择 20 条记录。但是,我发现它为我选择的记录的分布通常并不好。很多时候,它会选择 2 条具有顺序目录 ID 的记录,和/或多个彼此靠近的记录。从 800 条记录中选择 20 条记录时,这种情况应该很少发生。
我将目录 ID 列表存储在 @selection 数组中,并从该数组中随机抽取 20 个项目,我从随机排列的数组中分配前 20 个项目:
@selection = (shuffle @selection)[0 .. 19];
无奈之下,我尝试了这种丑陋的技术来试图强制更好的随机性,但它似乎没有任何区别:
@selection = shuffle @selection; sleep 1;
@selection = reverse @selection; sleep 1;
@selection = (shuffle @selection)[0 .. 19];
【问题讨论】:
-
我认为您看到了生日悖论en.m.wikipedia.org/wiki/Birthday_problem 的一种形式,确实,从 800 个中选择 20 个会导致两个相邻选择的频率比您预期的要高得多
-
虽然在这种情况下这实际上不是您的问题,但如果您想要比 Perl 的默认 PRNG 更好的随机性来源,Math::Random::Secure 可能会很有用。获取 List::Util::shuffle 来使用它可能很棘手。