arrays - Perl 从随机填充的数组中计算平均值

标签 arrays perl

我有一个需要帮助的学校作业。现在,我知道你在想什么,但我的老师不在城里,没有回复我的电子邮件,我的其他同学也不知道如何解决这个问题。一些指示和提示将不胜感激!

任务是这样的:

我们应该创建一个数组,用 1-100 范围内的 20 到 30 个随机整数填充它。然后,在子程序的帮助下,我们应该计算这些数字的平均值。

当我调用子例程时出现问题,这给了我答案 0 或“非法除以 0”错误。我现在的代码是这样的:

#! /usr/bin/perl -w

use warnings;
use strict;

# Declaring the scalar variables and arrays.
my @AllNumbers;

# Create random data set of between 20 to 30 measures used for the 100 random intigers.
my $random_number = int( rand( 31 - 20 ) ) + 20;

# Create random data set of 100 intigers.
for ( my $i = 0 ; $i <= $random_number ; $i++ ) {
    $AllNumbers[$i] = int( rand( 100 - 1 ) );
}

# Print the 20 to 30 random numbers (range 1 - 100).
print("Your random numbers are: \n@AllNumbers");

sub average {
    my $ArrayAverage = @_;
    for (@_) {
        my $total += $_;
    }
    return $ArrayAverage / $random_number;
} ## end sub average

# Print the mean/average of the 20-30 numbers.
print( "\n\nThe average of those random numbers is: ", &average, "\n\n" );

现在,正如我所说,我想自己解决这个问题,我已经花了整整两天的时间,但无论我做什么似乎都无法解决它。任何提示将非常感谢。附言应该提到的是,我们不应该使用任何模块/插件。

最佳答案

我首先要解决几个风格点:

  • 把你的子放在开头(或者如果你必须,放在最后)。将它放在代码中间很麻烦。
  • 不要用 & 调用子程序 - 这是不好的风格,会导致一些奇怪的行为。在你的情况下: &average 被有效地调用,没有参数。但总的来说它很糟糕,除非您明确知道为什么要这样做,否则不要使用它。 (它确实有一些用途,但是当你看到它们时你会知道——而且你不会在早期学习 perl 时)。
  • 这样的数组大写不是很好的形式,因为这就是模块/包的命名方式。如果可以的话,坚持使用小写变量。
  • 您的 for 循环是 C 风格,可以工作,但最好写成 for ( 1..$random_number ) {,因为您不需要迭代器。
  • 你不需要在 shebang 线上 -w ,因为你有 use warningsuse warnings; 是更好的方法。
  • 调用你的变量 $random_number 不是很有帮助 - 我们可以看到,因为它被分配了 rand 的结果。称之为它的用途 - 比如 $number_of_elements
  • 鉴于您只需要使用 $random_number 一次,您可能不需要将其粘贴在变量中。你可以,如果你觉得它有助于可读性(这是一个品味问题——在良好的编程中,清晰易读是唯一真正重要的事情——考虑到当今编译器的状态,大多数内存/性能都是过早的优化。)

  • 不过,您的核心问题是:
    my $ArrayAverage = @_;
    

    这会将 $ArrayAverage 设置为列表中的元素数。这将始终与 $random_number 相同,因为这是您迭代的次数。

    您在此处迭代元素,但实际上并未使用 $total
    for (@_) {
        my $total += $_;
    }
    

    所以在这里 - 你返回数组中的元素数除以数组中的元素数。
    return $ArrayAverage / $random_number;
    

    但真正重要的是 - 这些都不重要,因为您使用 &average 调用它,实际上并没有发送任何参数。所以你只是输入零,然后输出零。

    知道它可能很有用 - 标量上下文中的数组返回元素的数量,因此计算平均值很简单:
    my $sum; 
    $sum += $_ for @AllNumbers; 
    print( "\n\nThe average of those random numbers is: ", $sum / @AllNumbers, "\n\n" );
    

    这将产生一个长十进制 - 如果您需要格式化它,您可以使用 printfsprintf
    printf( "\n\nThe average of those random numbers is: %02.2f \n\n", $sum / @AllNumbers);
    

    所以我会稍微改写成这样:
    #!/usr/bin/perl
    
    use warnings;
    use strict;
    
    # Declaring the scalar variables and arrays.
    my @all_numbers;
    
    
    #repeat 20 + random 11 times - so 20-30
    for ( 1 .. 20 + int rand 11 ) { 
        push ( @all_numbers, int rand 99 );
    }
    
    # Print the 20 to 30 random numbers (range 1 - 100).
    print("Your random numbers are: \n@all_numbers\n");
    
    #calculate sum of elements
    my $sum; 
    $sum += $_ for @all_numbers;
    
    print "Sum: $sum count: ", scalar @all_numbers, "\n"; 
    
    # Print the mean/average of the 20-30 numbers.
    printf( "\n\nThe average of those random numbers is: %02.2f \n\n", $sum / @all_numbers);
    

    关于arrays - Perl 从随机填充的数组中计算平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35152207/

    相关文章:

    c - 从文件动态分配二维 double 组

    ios - 无法在 Swift xcode 6.3.1 中使用类型为 'functionName' 的参数列表调用 '([(nameOfClass)])'

    perl - 有没有更好的方法在 Perl 中从我的字符串中添加/删除 'B'?

    perl - 段落中的拆分句子

    perl - Perl 中引用子类包名

    python - 懒惰飞扬的鸟可以存活的最长时间 - 2 个阵列之间的连续间隙

    java - 随机生成器始终生成数字 0

    javascript - console.log 多维数组

    perl - 使用 Mojolicious 的异步聊天服务器

    regex - 为什么这两个RegEx基准测试有如此大的差异?