Re: [問題] 從array中隨機取得n個不重複元素
※ 引述《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]];
}
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.113.112.71
※ 文章網址: http://www.ptt.cc/bbs/Perl/M.1415009492.A.4A1.html
推
11/03 19:58, , 1F
11/03 19:58, 1F
推
11/03 21:20, , 2F
11/03 21:20, 2F
→
11/03 22:19, , 3F
11/03 22:19, 3F
推
11/03 22:56, , 4F
11/03 22:56, 4F
→
11/03 22:56, , 5F
11/03 22:56, 5F
推
11/03 23:00, , 6F
11/03 23:00, 6F
→
11/03 23:00, , 7F
11/03 23:00, 7F
→
11/03 23:01, , 8F
11/03 23:01, 8F
→
11/04 00:08, , 9F
11/04 00:08, 9F
→
11/04 00:09, , 10F
11/04 00:09, 10F
→
11/04 00:09, , 11F
11/04 00:09, 11F
推
11/04 00:52, , 12F
11/04 00:52, 12F
→
11/04 01:03, , 13F
11/04 01:03, 13F
→
11/04 01:05, , 14F
11/04 01:05, 14F
推
11/04 01:07, , 15F
11/04 01:07, 15F
→
11/04 01:07, , 16F
11/04 01:07, 16F
→
11/04 01:08, , 17F
11/04 01:08, 17F
→
11/04 01:08, , 18F
11/04 01:08, 18F
→
11/04 01:08, , 19F
11/04 01:08, 19F
→
11/04 01:09, , 20F
11/04 01:09, 20F
→
11/04 01:09, , 21F
11/04 01:09, 21F
→
11/04 01:12, , 22F
11/04 01:12, 22F
→
11/04 01:13, , 23F
11/04 01:13, 23F
討論串 (同標題文章)
Perl 近期熱門文章
PTT數位生活區 即時熱門文章