Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/perl
- use strict;
- use warnings;
- {
- use integer; #use integer math
- my $x = 123456789;
- my $y = 362436069;
- my $w = 88675123;
- my $z = 521288629;
- sub set_random_seed {
- $w = shift;
- }
- sub random {
- my $t = $x ^ ($x << 11);
- $x = $y;
- $y = $z;
- $z = $w;
- my $rand = $w = ($w ^ ($w >> 19)) ^ ($t ^ ($t >> 8));
- return $rand % 256; #scale it back to a byte at a time
- }
- }
- set_random_seed(5);
- print map { random(), "n" } 1 .. 10;
- 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;
- }
- }
Add Comment
Please, Sign In to add comment