ara*_*esh -1 arrays random perl
我想编写一个perl程序来生成具有长度为8的非重复单位数字(随机顺序的数字1-8)和第九个元素作为下划线的数组.我写了这样的代码.我想将这个生成的数组用于基于数字的益智游戏.
@mat = (0,0,0,0,0,0,0,0,0);
sub randgen {
$randigit = int(rand(9));
if ($randigit == 0) {
&randgen;
}
elsif ( $mat[0] == $randigit
|| $mat[1] == $randigit
|| $mat[2] == $randigit
|| $mat[3] == $randigit
|| $mat[4] == $randigit
|| $mat[5] == $randigit
|| $mat[6] == $randigit
|| $mat[7] == $randigit
|| $mat[8] == $randigit
)
{
&randgen;
}
}
&randgen;
for ( $assign = 0; $assign <= 8; $assign++) {
$mat[$assign] = $randigit;
print "@mat \n"; # To see to what extent the program has generated the array
&randgen;
}
for ($i = 0; $i <= $#mat; $i++) {
$sum = $sum + $mat[$i];
}
$miss = 36 - $sum ;
$mat[7] = $miss;
$mat[8] = "_";
print "@mat \n";
Run Code Online (Sandbox Code Playgroud)
程序在分配第7个元素后,我的程序开始吃内存(10 GB).我不明白这个原因.我用数学逻辑找到了缺失的数字(数字之和--36(n(n + 1)/ 2)).为什么要吃我的记忆?或者是否有任何有效的方法来编写相同的程序?
有没有有效的方法来编写相同的程序?
你打赌.您只需要几行:
use List::Util 'shuffle'; # import shuffle
my @array = shuffle( 1 .. 8 ); # shuffle 1 to 8
push @array, '_'; # add the underscore
Run Code Online (Sandbox Code Playgroud)
在一行中:
my @array = ( shuffle( 1 .. 8 ), '_' );
Run Code Online (Sandbox Code Playgroud)
考虑以下:
return一个值&randgen;时避免写作randgen();myuse strict; use warnings;我没有看过你的记忆是什么,但这是一种更简单的方法来实现你想要的东西:
#!/usr/bin/env perl
use strict;
use warnings;
use List::Util 'shuffle';
my @mats = shuffle 1 .. 8;
push @mats, '_';
print "@mats\n";
Run Code Online (Sandbox Code Playgroud)
样本输出:
3 1 5 8 2 7 4 6 _
Run Code Online (Sandbox Code Playgroud)