<?php
/*
 * PseudoRandomGenerator
 * PRNG
 *
 * Gebruikt bestand voor seeding
 * en meestal de bron van microtime()
 *
 * file: randomseed.txt
 */
class PRNG {

	/*
	 * Bestand waar random word opgeslagen
	 */
	const FILE = 'randomseed.txt';

	/*
	 * get Seed of microtime;
	 *
	 * @param option
	 * @return seed
	 */
	private function getSeed($options = 3) {

	    switch($options)
	    {
	        case 1:
	           // van php.net
	            list($usec, $sec) = explode(' ', microtime());
	            $seed = (float) $sec + ((float) $usec * 1000000);
	            break;
	        case 2:
	            $seed = (double)microtime()*1000003;
	            break;
	        case 3:
				// Gejat van PHP.net
	            $seed = hexdec(substr(md5(microtime()), -8)) & 0x7fffffff;
	            break;
	        default:
	            break;
	    }
	    return $seed;
	}

	/*
	 * Laat laatste random van bestand
	 *
	 * @return seed
	 */
	private function loadLastRandom() {
		if(file_exists(self::FILE)) {
			return file_get_contents(self::FILE);
		} else {
			return 0;
		}
	}

	/*
	 * Schrijf laatste random naar bestand
	 *
	 * @return boolean;
	 */
	private function writeLast($seed = 0) {
		$fp = fopen(self::FILE,'wb');

		if(!$fp) {
			throw new runtimeException('Bestand kan niet gemaakt of geschreven worden, seed file');
		}

		if(!fwrite($fp,$seed)) {
			return false;
		}
		fclose($fp);
	}

	/*
	 * Get Seed
	 *
	 * @param option ref to getSeed
	 * @return boolean;
	 */
	static public function Seed($type = 3) {
		mt_srand((self::loadLastRandom() + self::getSeed($type)) & 0x7fffffff);
		if(self::writeLast(mt_rand()) !== false) {
			return true;
		}
		return false;
	}

}

?>