cdkrr
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..8){
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!";
dajun
o 问题在这:
[quote]
@array=keys(%hash);
[/quote]
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]
把你的程序的开始部分改成这样子:
[quote]
#srand();
while(@array!=9){
my $num=int(rand(10)-1);
unless(grep /^$num$/, @array) {
push @array, $num;
}
}
[/quote]
原来楼主想搞一个类似CS里控制方向的东东的 -_-!!! 不错啊,
[[i] 本帖最后由 dajun 于 2008-7-2 10:55 编辑 [/i]]