List :: Util'shuffle'实际上如何工作?

时间:2011-03-02 13:28:48

标签: perl random cpan classification

我目前正在使用c5.0构建分类器。我有一个8000条目的数据集,每个条目都有自己的i.d号码(1-8000)。在测试分类器的性能时,我必须制作5组10:90(训练数据:测试数据)分割。当然,任何训练案例都不能再出现在测试用例中,并且在任何一组中都不会出现重复。

为了解决为训练数据随机选择示例的问题,并确保不能为测试数据挑选相同的问题,我开发了一种非常慢的方法;

  • 在单独的行中填写1-8000的数字文件。

  • 随机选择一个行号(范围为1-8000)并使用该行的内容作为训练示例的ID号。

  • 将所有未删除的号码写入新文件

  • 将随机数发生器的范围递减1

  • 重做

然后将所有未标记的数字用作测试数据。它有效,但速度很慢。为了加快速度,我可以使用List :: Util'shuffle'来“随机”混乱和这些数字的数组。但随机的是“随机播放”?必须保持相同的准确度。对这篇文章感到抱歉,但是有谁知道'shuffle'实际上是如何运作的。任何帮助都会很棒

1 个答案:

答案 0 :(得分:9)

以下是List::Util::PP

中使用的随机播放算法
sub shuffle (@) {
  my @a=\(@_);
  my $n;
  my $i=@_;
  map {
    $n = rand($i--);
    (${$a[$n]}, $a[$n] = $a[$i])[0];
  } @_;
}

看起来像Fisher-Yates shuffle。