Re: [问题] 从array中随机取得n个不重复元素

楼主: CindyLinz (Cindy Wang)   2014-11-03 21:15:17
※ 引述《abliou (愚者)》之铭言:
: 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]];
: }
来帮忙补充一些~ ^^
Perl 的 core module (就是有 perl 就会有, 不用再另外装的 module)
有一个叫作 List::Util
里面有个函数叫作 shuffle, 用来把一个 list 打乱
https://metacpan.org/pod/List::Util#shuffle
也蛮适合用在这边~~
use List::Util qw(shuffle);
sub randpick {
my($max, $need) = @_;
(shuffle (0..$max-1))[0..$need-1];
}
btw, 我觉得这边的用法还是宣告个变量比较好啦..
因为小括号中括号大括号叠成一大团有点乱.. ^^|
那个 (...)[0..$need-1] 的部分,
这边也可以考虑 builtin 的 splice, 写成
use List::Util qw(shuffle);
sub randpick {
my($max, $need) = @_;
splice [shuffle (0..$max-1)], 0, $need;
}
splice 的说明在这边~~
http://perldoc.perl.org/functions/splice.html
PS.
我这边 randpick 的最后面没有写 return,
这在 Perl 是可以的, 呼叫 randpick() 的人会拿到这最后一个 statement 的结果.
我还不是很肯定这是不是好的风格..
确定的是它会省一个 OP cycle 和无意义的“提前离开”的动作, 效能会比较好
(这是 Perl <= 5.18 的话,
而 Perl >= 5.20 以后会自动把 sub 里的最后一个 return 去掉)
嗯, 多写一个 return 字样, 我原本觉得它当然会比较清楚明确,
只是最近看到 Moz 设计了一套叫作 Rust 的语言
(听说想用来实作新一代的浏览器),
它的定位是效能大约在 C 或 C++ 的层级, 而严谨度比它们更好.
在 Rust 里面如果最后一个 statement 没有加分号,
那么呼叫端就会拿到它的结果.
虽然也可以写成 return,
但是它甚至在官方文件里面建议不写 return 为佳...
使我不由得反省我习惯最后面明确写出 return,
是不是只是从 C 开始就这样写,
其后的 C++, Java, 或是 PHP, Javascript 也都一样,
想要 return 东西出去就一定要写 return,
其实只是个习惯, 也许不见得是好的习惯..
作者: abliou (愚者)   2014-11-03 22:21:00
splice不错!!!!!一开始写perl我也都不用return 接触C之后才养成习惯
楼主: CindyLinz (Cindy Wang)   2014-11-03 22:50:00
到底怎样比较好咧.. XD
作者: scwg ( )   2014-11-03 23:53:00
当 functional language 写就不加 return 啦!
楼主: CindyLinz (Cindy Wang)   2014-11-04 00:01:00
好像不错的理由兼借口.. XD

Links booklink

Contact Us: admin [ a t ] ucptt.com