srand(),rand()的困惑

srand(),rand()的困惑

小弟近日做了一个数字拼图游戏,很幼稚,自娱自乐性质的东西。
但是其中有个问题着实令我困惑。
就是随机生成唯一数组的时候,总是生成6 3 7 2 8 4 1 0 5,或者6 3 7 2 8 1 4 0 5;
请高人指点下我这个迷路的羔羊吧................


代码如下:

use strict;

my %hash;
my @array;
my $num1=0;
my $num_frist;
my $all_num=0;
my $time1=localtime();
srand();
while(@array!=9){
$num1++;

        my $num=int(rand(10)-1);
        if(!(exists $hash{$num})){
                $hash{$num}=$num;
                        @array=keys(%hash);
                        }
               
        }

#print "@array\n";

print"-------------\n";
print"| $array[0] | $array[1] | $array[2] |\n";
print"-------------\n";
print"| $array[3] | $array[4] | $array[5] | \n";
print"-------------\n";
print"| $array[6] | $array[7] | $array[8] | \n";
print"-------------\n";
until($array[0]==1 && $array[1]==2 && $array[2]==3 && $array[3]==4 && $array[4]==5 && $array[5]==6 && $array[6]==7 && $array[7]==8 && $array[8]==0){
        for(0..{
                if ($array[$_]==0){
                  $num_frist=$_;
             }
              }
  chomp(my $oprate_num=<STDIN>;
  $all_num++;
   if($oprate_num eq 'w' && $num_frist+3<9){
           $array[$num_frist]=$array[$num_frist+3];
           $array[$num_frist+3]=0;
         }
     elsif($oprate_num eq 'd' && $num_frist%3!=0){
                     $array[$num_frist]=$array[$num_frist-1];
               $array[$num_frist-1]=0;
              }        
       elsif($oprate_num eq 'a' && $num_frist%3!=2){
                     $array[$num_frist]=$array[$num_frist+1];
               $array[$num_frist+1]=0;
              }
       elsif($oprate_num eq 's' && $num_frist-2>0){
           $array[$num_frist]=$array[$num_frist-3];
           $array[$num_frist-3]=0;
         }
       elsif($oprate_num eq 'q'){
               goto FANGQI;
               }
               system("cls";
print"-------------\n";
print"| $array[0] | $array[1] | $array[2] |\n";
print"-------------\n";
print"| $array[3] | $array[4] | $array[5] | \n";
print"-------------\n";
print"| $array[6] | $array[7] | $array[8] | \n";
print"-------------\n";
}
print "You Win the game!\n";
print "You used $all_num step.";
#my $time2=localtime();
#my $timeall=$time2-$time1;
print "You use $time1.";
FANGQI:print"Game Over!";
去掉srand
不行的,去掉也一样。
o  问题在这:

QUOTE:
@array=keys(%hash);

hash的key虽然说是无序的,但是貌似顺序也常是固定的,
我没做什么深入的研究, 以前写过一个小脚本,你运行一下就知道了:

QUOTE:
#!/usr/bin/perl

use strict;
use warnings;

# build hash

my %kh = ();
for (1..100) {
    my $key = $_;
    $kh{$key} = rand();
}

for (1..10) {
    my @keyz = keys %kh;
    print "@keyz\n";
    print "\n";
}

把你的程序的开始部分改成这样子:

QUOTE:
#srand();
while(@array!=9){

    my $num=int(rand(10)-1);
    unless(grep /^$num$/, @array) {
        push @array, $num;
    }
}

原来楼主想搞一个类似CS里控制方向的东东的 -_-!!!   不错啊,

感谢dajun!

问题解决了。

%hash的无序原来也是有序的啊..................

太感谢啦~