随机数组程序吃我的记忆

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)).为什么要吃我的记忆?或者是否有任何有效的方法来编写相同的程序?

Zai*_*aid 6

有没有有效的方法来编写相同的程序?

你打赌.您只需要几行:

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();
  • 词汇范围通过 my
  • use strict; use warnings;
  • 避免在可能的情况下进行递归调用(这可能是您的内存消耗的来源)


fle*_*esk 5

我没有看过你的记忆是什么,但这是一种更简单的方法来实现你想要的东西:

#!/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)