2013-11-10 3 views
-6

Я пытаюсь сделать свой массив целыми, но потому, что я использую random_normal, он возвращает мне список поплавков. Как я могу получить список целых чисел?random normal as Integer in array

Было бы здорово, если бы я мог подсчитать количество дубликатов в моем массиве.

use strict; 

use Math::Random qw(:all); 

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

По-видимому, эта функция производит поплавки, справляется с ней. Но как вы хотите округлить каждое число: вверх, вниз, вдали от 0, к нулю, нормально? (Заметка стиля: Пожалуйста, разделите слова в имени функции на символы подчеркивания и выберите более короткие, более семантически описательные имена) – amon

+0

его не может быть .. есть конечно способ сделать это целое число ... – user2976056

+2

@ user2976056 [ Math :: Random' docs] (https://metacpan.org/pod/Math::Random) не упоминают, как это могло бы вернуть целые числа (которые бесполезны всякий раз, когда вы работаете с вероятностями). Но округлить их на самом деле не сложно - как только вы решите, как вы хотите объединиться. – amon

ответ

0

Вы можете взять целую часть числа,

use Math::Random qw(:all); 

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

Ну, как правило, если люди имеют значение с плавающей точкой (например: 5,5), и они хотят целое, они, как правило, вокруг него , "как-то". Хотя «как-то» зависит от того, чего вы хотите, как говорит @amon.

  • этаж: 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
  • раунд: 5 → 5, 5,1 → 5, 5,5 → 6, 5,9 → 6, 6 → 6

Хотя, какой метод использовать, и как использовать его, perldoc -q round ответил это ясно:

Имеет ли Perl функцию round()? Как насчет ceil() и floor()? Триг функции?

Помните, что «Int()» просто обрезает в сторону 0. Для округления до определенного количество цифр, «Sprintf()» или «Е()», как правило, самый простой путь.

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

Модуль POSIX (часть стандартного дистрибутива Perl) реализует "CEIL()", "пол()", а также ряд других математических и тригонометрических функций .

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

В +5,000 до +5,003 Перлз, тригонометрии было сделано в Math :: Complex модуля. С 5.004 модуль Math :: Trig (часть стандартного дистрибутива Perl ) реализует тригонометрические функции. Внутренне он использует Матх :: 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 
+0

спасибо большое !! это кажется действительно хорошим !! – user2976056