如何随机打乱某组数据,并按任意键显示?-[结帖]

楼上的会出现重复中奖的情况,正确代码如下:
my @pool=(   '张三',   '李四',   '王五',   '刘六',   '陈七',);
my $i = @pool; # $i是数组的长度

for(@pool){
    print "Press ENTER key to continue!\nEnter 'exit' to exit the programme\n";
    exit if <>=~/exit/i;
my $n; #存放随机数

$n = rand($i--);
print $pool[$n]," win!\n";
 $pool[$n] = $pool[$i];  
}
<>;

具体分析请见:
http://www.notii.com/2007/08/shuffle.html
被插队了,是楼上的楼上。
楼上的朋友,若要显示“ID:USER"格式,比如“002:李四”,该如何修改?我改来改去就是不行,我是用的hash,请您指教!
my %hash=(
   001=>'张三',
   002=>'李四',
   003=>'王五',
   004=>'刘六',
   005=>'陈七',
);

use strict;
my %hash=(
   '001'=>'张三',
   '002'=>'李四',
   '003'=>'王五',
   '004'=>'刘六',
   '005'=>'陈七',
);
my @pool=keys %hash;
my $i = @pool; # $i是数组的长度

for(@pool){
    print "Press ENTER key to continue!\nEnter 'exit' to exit the programme\n";
    exit if <>=~/exit/i;
my $n; #存放随机数

$n = rand($i--);
print $pool[$n],": ",$hash{$pool[$n]}," win!\n";
 $pool[$n] = $pool[$i];  
}
print "Over! press Enter to exit!";
<>;
回楼上老大:按照我先前的考虑,打算for(@pool){}中,随机抽到一个ID后,立即将该ID用delete函数处理掉,然后循环剩余的ID,直到每个ID都被抽完为止。这样就不会出现一轮抽签中某个ID被重复抽到的情况了。
我尝试了下,用delete始终没有写成功,有想法,但细致地又写不出来,痛苦,请帮帮忙,然后我拿两种方案比较,参详,您费心了!

删除元素的效率太低.

直接随机生成序号, 排序后输出.
回L兄:直接随机生成序号, 为何还要排序输出?按什么顺序?请讲讲


QUOTE:
原帖由 windows.li 于 2007-12-11 23:59 发表
回楼上老大:按照我先前的考虑,打算for(@pool){}中,随机抽到一个ID后,立即将该ID用delete函数处理掉,然后循环剩余的ID,直到每个ID都被抽完为止。这样就不会出现一轮抽签中某个ID被重复抽到的情况了。
我尝 ...

delete 是hash的,还得再转化位数组@pool,还麻烦点。
生成随机号后排序输出好点
随机生成序号, 为何还要排序输出?按什么顺序?关键是:要控制每轮抽签,每个用户都能被抽到,并且之能被抽一次


QUOTE:
原帖由 windows.li 于 2007-12-12 09:44 发表
随机生成序号, 为何还要排序输出?按什么顺序?关键是:要控制每轮抽签,每个用户都能被抽到,并且之能被抽一次

每个用户仅被抽到1次, 他们就形成了一个先后顺序, 一次生成这个顺序, 排序后, 就是每一轮抽到的人.
为什么非得模拟每轮来随机一次选一个人呢.