-6

我试图让我的数组包含整数,但因为我用random_normal它给了我一个浮点数列表。如何获得整数列表?

如果我也可以计算数组中重复的数量,那也很棒。

use strict;

use Math::Random qw(:all);

my @rand_arr = random_normal(1000,50,5);
print "@rand_arr \n";
4

2 回答 2

2

好吧,通常,如果人们有一个浮点值(即: 5.5 ),并且他们想要一个整数,他们倾向于“以某种方式”对其进行舍入。正如@amon 所说,尽管“不知何故”取决于您想要什么。

  • 楼层 : 5 → 5, 5.1 → 5, 5.5 → 5, 5.9 → 5 , 6 → 6
  • 细胞 : 5 → 5, 5.1 → 6, 5.5 → 6, 5.9 → 6, 6 → 6
  • 回合 : 5 → 5, 5.1 → 5, 5.5 → 6, 5.9 → 6 , 6 → 6

虽然至于使用哪种方法以及如何使用它,但perldoc -q round答案很清楚:

Perl 有 round() 函数吗?ceil() 和 floor() 呢?三角函数?

请记住,“int()”只是向 0 截断。要舍入到特定位数,“sprintf()”或“printf()”通常是最简单的方法。

    printf("%.3f", 3.1415926535);   # prints 3.142

POSIX 模块(标准 Perl 发行版的一部分)实现了“ceil()”、“floor()”以及许多其他数学和三角函数。

    use POSIX;
    my $ceil   = ceil(3.5);   # 4
    my $floor  = floor(3.5);  # 3

在 5.000 到 5.003 perls 中,三角函数是在 Math::Complex 模块中完成的。在 5.004 中,Math::Trig 模块(标准 Perl 发行版的一部分)实现了三角函数。它在内部使用 Math::Complex 模块,并且一些函数可以从实轴分解到复平面,例如 2 的反正弦。

金融应用程序中的四舍五入可能会产生严重影响,并且应精确指定所使用的四舍五入方法。在这些情况下,不信任 Perl 使用的任何舍入系统可能是值得的,而是自己实现所需的舍入功能。

要了解原因,请注意在中途交替时您仍然会遇到问题:

    for (my $i = 0; $i < 1.01; $i += 0.05) { printf "%.1f ",$i}

    0.0 0.1 0.1 0.2 0.2 0.2 0.3 0.3 0.4 0.4 0.5 0.5 0.6 0.7 0.7
    0.8 0.8 0.9 0.9 1.0 1.0

不要责怪 Perl。这与 C 中的相同。IEEE 说我们必须这样做。Perl 数字的绝对值是小于 2**31 的整数(在 32 位机器上),其工作方式与数学整数非常相似。不保证其他数字。

将上述函数之一与 random_normal 结合使用非常容易

my @values = map { some_function($_) } random_normal(1000,50,5);

请注意,根据您对这些数字的处理方式,使用的舍入方法可能非常重要。

use strict;
use warnings;
use utf8;

use Math::Random qw(random_normal);

my $buckets = {};

sub round { 
  return 0 + sprintf "%.0f", $_[0];
}

for my $int ( map { round($_) } random_normal(1000,50,5) ) {
  $buckets->{$int} //= 0;
  $buckets->{$int} ++;
}
for my $key ( sort { $a <=> $b } keys %$buckets ) {
  printf "%s %s\n", $key, $buckets->{$key};
}

运行该程序几次之后,您可能会意识到您选择舍入是一个坏主意,因为舍入会导致整数桶溢出,稍微破坏正态分布:

34 2
36 1    # Trough
37 3
38 5
39 11   # Spike
40 9
41 25
42 21
43 24
44 43
45 51   
46 48   # Trough
47 69
48 62
49 79
50 77
51 71
52 82
53 71
54 66
55 47
56 38
57 33
58 15   # Trough
59 21
60 8
61 9    # Spike
63 4
64 3
65 1
66 1
于 2013-11-10T13:09:41.003 回答
0

你可以取数字的整数部分,

use Math::Random qw(:all);

my @rand_arr = map int, random_normal(1000,50,5);
于 2013-11-10T12:47:00.197 回答