Насколько велик аргумент в пользу Perl? - PullRequest
5 голосов
/ 13 мая 2011

rand(n) возвращает число от 0 до n.Будет ли rand работать должным образом в отношении «случайности» для всех аргументов вплоть до целочисленного предела на моей платформе?

Ответы [ 3 ]

8 голосов
/ 13 мая 2011

Это будет зависеть от вашего randbits значения:

rand вызывает генератор случайных чисел вашей системы (или тот, который был скомпилирован в вашу копию Perl).Для этого обсуждения я назову этот генератор RAND, чтобы отличить его от rand, функции Perl.RAND выдает целое число от 0 до 2 ** случайных чисел - 1 включительно, где случайное число является маленьким целым числом.Чтобы увидеть, что находится в вашем perl, используйте команду 'perl -V: randbits'.Общие значения: 15, 16 или 31.

Когда вы вызываете rand с аргументом arg, perl принимает это значение как целое число и вычисляет это значение.

                        arg * RAND
          rand(arg) = ---------------
                        2**randbits

Это значение всегда будетпадение в требуемом диапазоне.

          0  <=  rand(arg)  < arg

Но так как arg становится большим по сравнению с 2 ** рандами, вещи становятся проблематичными.Давайте представим машину, где randbits = 15, поэтому RAND находится в диапазоне от 0..32767.То есть всякий раз, когда мы вызываем RAND, мы получаем одно из 32768 возможных значений.Поэтому, когда мы вызываем rand (arg), мы получаем одно из 32768 возможных значений.

2 голосов
/ 28 августа 2012

Это зависит от количества бит, используемых генератором случайных чисел вашей системы (псевдо).Вы можете найти это значение с помощью

perl -V:randbits

или в программе с помощью

use Config;
my $randbits = $Config{randbits};

rand может генерировать 2 ^ случайных чисел различных случайных чисел.Хотя вы можете генерировать числа больше 2 ^ рандов, вы не можете генерировать все целочисленные значения в диапазоне [0, N), когда N> 2 ^ рандов.

Значения N, которые не являютсяСтепень двойки также может быть проблематичной, так как распределение (целочисленных) случайных значений не будет ровным.Некоторые значения будут немного переоценены, другие - недостаточно недооценены.

Стоит отметить, что randbits - это ничтожная цифра в Windows.Это означает, что вы можете получить только 32768 (2 ** 15) различных значений.Вы можете улучшить ситуацию, сделав несколько звонков на rand и комбинируя значения:

use Config;
use constant RANDBITS => $Config{randbits};
use constant RAND_MAX => 2**RANDBITS;

sub double_rand {
    my $max = shift || 1;
    my $iv  =
          int rand(RAND_MAX) << RANDBITS
        | int rand(RAND_MAX);
    return $max * ($iv / 2**(2*RANDBITS));
}

Предполагая, что randbits = 15, double_rand mimics randbits = 30, обеспечивая 1073741824 (2 ** 30) возможных различныхценности.Это облегчает (но никогда не может устранить) обе проблемы, упомянутые выше.

0 голосов
/ 22 сентября 2012

Речь идет о больших случайных целых числах и о том, можно ли их получить. Следует отметить, что объединение двух случайных целых чисел также является случайным целым числом. Поэтому, если ваша система по какой-либо причине не может выйти за пределы 999999999999, просто напишите

$bigrand = int(rand(999999999999)).int(rand(999999999999));

и вы получите случайное целое число (максимально), вдвое больше длины.

(На самом деле это не числовой ответ на вопрос «насколько большим может быть число ранда», а скорее ответ «вы можете получить столько, сколько захотите, просто объедините небольшие числа».)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...