作者Andor (柠檬汁)
站内perl
标题Re: [问题]这个有办法简化妈?
时间Fri Jul 21 11:41:47 2006
※ 引述《qrtt1 (愚者)》之铭言:
:
※ 发信站: 批踢踢实业坊(ptt.cc)
: ◆ From: 140.120.15.17
: 推 LiloHuang:print join $/,(sort{rand>.5?-1:1}1..10); 07/14 01:33
: → darenhu:perlfaq4: How do I shuffle an array randomly? 07/14 07:55
: → darenhu:use Util::List qw(shffle); @hitno = shuffle 0..9; 07/14 08:05
: → darenhu:更正: use List::Util qw(shuffle); 才对 07/14 08:08
: haha. 如果只是想乱排的话
: 那用sort就好了压:)
: @a = (4,5,6,7,8,2,2334,345,1,-23,4);
: @b = sort { $a <=> $b } @a;
: @c = sort { rand() <=> rand() } @a;
: print "@b\n@c\n";
这效果和LiloHuang大的演算法是相同的,但多用了一倍的rand()。
而且重点是,这样得到的结果不是均匀分布的。
以perl 5.8中的sort缺省使用的mergesort为例,我简单计算一下就可以断定:
8和2出现在$c[0]的机率是除最後那个4外其他数的2倍,是最後那个4的1/2。
我在知道好物List::Util之後就都用它的shuffle了,
List::Util超好用的你都不知道 b( ̄︶ ̄)>
而之前我都是用这个演算法的:
$a=int(rand($_+1)), @a[$_, $a] = @a[$a, $_] foreach (1..$#a);
其实这和List::Util的shuffle的演算法是一样的,但不如它写得巧妙。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 143.89.144.107
※ 编辑: Andor 来自: 143.89.144.107 (07/21 12:50)
1F:推 qrtt1:乱数的学问真大啊orz 07/23 22:11