Попробуйте использовать LFSR - Регистр сдвига с линейной обратной связью. . T у первой ссылки на внешних ссылках есть все, что нужно для получения любого количества бит случайности. Приятно то, что это легко реализовать и можно сделать, используя все целочисленные математические вычисления.
Я успешно использовал его в проекте 8051. С Perl это будет несложно.
Обновление:
Вот быстрая реализация 8-битного LFSR на Perl:
use strict;
use warnings;
use List::Util qw(reduce);
use vars qw($a $b);
print 'Taps: ', set_taps( 8, 7, 2, 1 ), "\n";
print 'Seed: ', seed_lfsr( 1 ), "\n";
print read_lfsr(), "\n" for 1..10;
BEGIN {
my $tap_mask;
my $lfsr = 0;
sub read_lfsr {
$lfsr = ($lfsr >> 1) ^ (-($lfsr & 1) & $tap_mask );
return $lfsr;
}
sub seed_lfsr {
$lfsr = shift || 0;
$lfsr &= 0xFF;
}
sub set_taps {
my @taps = @_;
$tap_mask = reduce { $a + 2**$b } 0, @taps;
$tap_mask >>= 1;
$tap_mask &= 0xFF;
return $tap_mask;
}
}
Этот код является всего лишь прототипом. Если бы я хотел использовать его в производстве, я бы, вероятно, обернул его в объект и сделал бы настраиваемый размер регистра. Тогда мы избавимся от этих надоедливых общих переменных.