※ 引述《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]];
}