我在Perl中有一个数组,我想以概率的方式从中抽取样本。例如,在R
中,函数sample
为我做了,例如
x = c('a','b','c','d')
sample(x,size = 2,prob = c(0.1,0.4,0.4,0.1))
以上代码会更频繁地返回b,c
。我如何在Perl中做同样的事情。有没有一个模块可以帮我吗?
提前谢谢。
答案 0 :(得分:1)
这可以使用vsearch函数在PDL(按比例)完成。
use strict;
use warnings;
use PDL;
my @x = qw( a b c d );
my $pdf = pdl( 0.1, 0.4, 0.4, 0.1 );
# vsearch requires a CDF,
my $cdf = $pdf->dcumusumover;
$cdf /= $cdf->max;
# $sample is a piddle containing the indices into @x;
my $sample = vsearch( random(10000), $cdf );
print scalar hist( $sample, 0, 4, 1 ), "\n";
结果
% perl x.pl
[991 3974 4014 1021]
答案 1 :(得分:0)
使用基本的perl命令,您可以执行类似
的操作my @vals = ('a','b','c','d');
my @probs = (0.1,0.4,0.4,0.1);
my @result;
for(my $i=0; $i<20; $i++) {
my $draw = rand(1);
my $v = 0;
while ($draw>0 && $draw > $probs[$v]){
$draw -= $probs[$v];
$v++;
}
push @result, $vals[$v];
}
print join(", ", @result), "\n";