※ 引述《peter0726 (江 谢)》之铭言:
: 各为版友大家好
: 小弟有个问题,如标题所述
: 现在想写一个功能
: 大致上就是随机从n个数字中取出m个不重复的数字
: 目前写出来的可以正确执行
: 可是当数字大的时候就会执行颇久的
: 想请教各位有没有更有效率的写法0.0?
: 目前的程式码如下
: sub randpick {
: my $max = shift;
: my $need = shift;
: my %pick;
: my @picked = keys %pick;
^^^^^^^^^^^^^^^^^^^^^^^^ 看了半天 不知道这行在干嘛 设定成空阵列?
: while (@picked < $need) {
: my $num = int(rand($max));
: $pick{$num} = 1;
^^^^^^^^^^^^^^^^ 效率不彰的根源就在这
你的"避免重复"的方法就是使用杂凑 但是当你数字多了
抽到一样数字的机会就会变大 造成这个while循环跑不完
解决方法很简单 先做出一个不重复的阵列 把这阵列打乱
然后切前面几个就好了
: @picked = sort{$a <=> $b} (keys %pick);
: }
: return %pick;
: }
sub randpick {
my $max = shift;
my $need = shift;
return @{[sort{rand()>0.5}(0..$max)]}[1..$need];
}
或者连宣告变量都免了
sub randpick {
return @{[sort{rand()>0.5}(0..$_[0])]}[1..$_[1]];
}