random normal作为数组中的整数

时间:2013-11-10 11:56:57

标签: perl

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

如果我能算出数组中的重复数量,也会很棒。

use strict;

use Math::Random qw(:all);

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

2 个答案:

答案 0 :(得分:2)

通常情况下,如果人们有一个浮点值(即:5.5),并且他们想要一个整数,他们倾向于围绕它,“某种程度上”。虽然“某种程度上”取决于你想要什么,正如@amon所说。

  • floor:5→5,5.1→5,5.5→5,5.9→5,6→6
  • ceil:5→5,5.1→6,5.5→6,5.9→6,6→6
  • round:5→5,5.1→5,5.5→6,5.9→6,6→6

关于使用哪种方法以及如何使用它,perldoc -q round清楚地回答了这个问题:

  

Perl是否有round()函数?那么ceil()和floor()怎么样?   Trig功能?

     

请记住,“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

答案 1 :(得分:0)

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

use Math::Random qw(:all);

my @rand_arr = map int, random_normal(1000,50,5);