【求助】关于如何‘乱序’的问题

【求助】关于如何‘乱序’的问题

有一个列表
1。。10
如何取得其乱序并且包括每一个元素并不重复的列表?
或才可以说‘洗牌’

最近在写一个小脚本随机播放音乐
关联数组(也许我应该称呼hash)的随机性不够大
还是有一定规律的      
想了很久
现用一个笨方法实现
(希望版主不介意我在此发表perl的脚本)
如果哪位有更好的方法
可别吝啬:w
复制内容到剪贴板
代码:
[0 N0.2056 huan ~/svn_perl/developing ]$ cat rand_in_list.pl
#! /usr/bin/perl -w
#
#
%list = (
        1 => 1,
        2 => 2,
        3 => 3,
        4 => 4,
        5 => 5,
        6 => 6,
        7 => 7,
        8 => 8,
        9 => 9,
        10 => 10
);

OUT:
for ($index=1;$index<=10; $index++){
        for($i=20; $i>0; $i--){
                $rand_index = int( rand($i) );
                if ( $list{$rand_index} ){
                        $r = delete $list{$rand_index};
                        print $r."\t";
                        next OUT;
                }
        }
}
#捕杀漏网之鱼
if (%list){
        foreach ( keys %list){
                print $list{$_}."\t";
        }
}
print "\n";
复制内容到剪贴板
代码:
[0 N0.2057 huan ~/svn_perl/developing ]$ i=1;while((i<=10));do ./rand_in_list.pl ;((i++));done
1       7       10      2       8       3       4       9       6       5
1       7       9       8       5       3       4       10      6       2
3       4       10      7       6       5       1       8       2       9
7       10      4       6       9       1       3       5       2       8
6       4       3       1       8       10      5       9       2       7
9       1       8       6       2       10      3       4       7       5
8       10      1       3       7       6       4       2       5       9
3       10      1       2       7       5       4       6       9       8
9       5       4       1       6       7       8       2       3       10
7       6       2       10      4       3       8       5       9       1

[0 N0.2058 huan ~/svn_perl/developing ]$
      
复制内容到剪贴板
代码:
[color=blue]-(user@host:tty)-(tmp)-
[4016 0] $ [/color]cat foo.sh
#!/bin/bash

N=10
for ((i = 0; i < N; ++i)); do
    while true; do
        ((n = 1 + RANDOM % N))
        found=0
        for ((j = 0; j < i; ++j)); do
            if ((l[j] == n)); then
                found=1
                break
            fi
        done

        if ((!found)); then
            ((l[i] = n))
            printf "%4d" $n
            break
        fi
    done
done
echo
[color=blue]-(user@host:tty)-(tmp)-
[4016 0] $ [/color]for i in {1..10}; do ./foo.sh; done
   7  10   4   3   8   6   5   1   9   2
   1   9   4   8   7   5   6  10   3   2
   7   4   5   1   9  10   8   6   3   2
   4   3   2   6   7  10   9   1   5   8
   8   1   4  10   5   6   3   9   2   7
   4   9   7   6   1   2   8   5  10   3
   8   6   5   1   9   7  10   3   4   2
   2   3   1   6   8   4   9  10   5   7
   9   1   8   6   4   7   5   2   3  10
   5   9   1   6   4  10   7   2   3   8
[color=blue]-(user@host:tty)-(tmp)-
[4016 0] $ [/color]
      
dearvoid度假回来啦。。。


很不错
看得我好累。。。
呵      
感谢 huanhuan 对 shell 版的大力支持