Если вам нужны случайные числа из диапазона, я не знаю более эффективного способа. Ваш сценарий адаптирован к моим предпочтениям:
#!/usr/bin/perl
use warnings;
use strict;
die("usage: $0 <size_in_bytes> <file_name>\n") unless @ARGV == 2;
my ($num_bytes, $fname) = @ARGV;
open(FILE, ">", $fname) or die "Can't open $fname for writing ($!)";
my $minimum = 32;
my $range = 96;
for (1 .. $num_bytes) {
print FILE pack( "c", int(rand($range)) + $minimum);
}
close(FILE);
Я использую pack("c")
, когда мне действительно нужен двоичный файл. chr()
тоже может быть хорошо, но IIRC на самом деле зависит от того, какой символ использует ваша среда (подумайте ASCII против utf8.)
Кстати, если вам действительно нужен двоичный файл для совместимости с Windows, вы можете добавить binmode FILE;
после open
.
В противном случае, если диапазон является необязательным, вы можете просто dd if=/dev/random of=$filename bs=1 count=$size_of_the_output
(или в Linux более быстрая крипто-небезопасная /dev/urandom
). Но это будет намного медленнее, поскольку /dev/random
действительно пытается доставлять реальные случайные биты - по мере их появления. И если их недостаточно (например, на вашей платформе нет H / W RNG), производительность действительно пострадает - по сравнению с невероятно быстрым генератором псевдослучайных чисел libc (Perl использует внутренне для реализации rand()
) .