-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 の perl では、三角法は 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 は、これを行う必要があると言っています。絶対値が 2**31 (32 ビット マシン上) 未満の整数である Perl の数値は、数学的な整数とほとんど同じように機能します。他の数値は保証されません。

上記の関数のいずれかを 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 に答える