Это зависит от количества бит, используемых генератором случайных чисел вашей системы (псевдо).Вы можете найти это значение с помощью
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) возможных различныхценности.Это облегчает (но никогда не может устранить) обе проблемы, упомянутые выше.