<?php

class PseudoRandomGenerator {
    protected $state = null;
    public function __construct($seed) {
        $this->state = $seed;
    }
    public function next($max) {
        $bits = (int) floor(log($max, 2) + 1);
        $bytes = (int) max(ceil($bits / 8), 1);
        $mask = (int) (pow(2, $bits) - 1);

        do {
            $test = $this->gen($bytes);
            $result = hexdec(bin2hex($test)) & $mask;
        } while ($result > $max);
        return $result;
    }

    protected function gen($bytes) {
        $this->state = hash('sha512', $this->state, true);
        return substr($this->state, 0, $bytes);
    }
}

$gen = PseudoRandomGenerator(1);
var_dump($gen->next(5));
var_dump($gen->next(5));
var_dump($gen->next(5));
var_dump($gen->next(5));
var_dump($gen->next(5));
var_dump($gen->next(5));