New Random generator

This commit is contained in:
Shoghi Cervantes 2014-04-08 15:41:32 +02:00
parent 5abe5bd43d
commit 9d8e6d5f8c

View File

@ -28,12 +28,18 @@ namespace pocketmine\utils;
* If this class is modified, remember to modify the PHP C extension. * If this class is modified, remember to modify the PHP C extension.
*/ */
class Random{ class Random{
private $z, $w;
protected $x;
protected $y;
protected $z;
/** /**
* @param int $seed Integer to be used as seed. * @param int $seed Integer to be used as seed.
*/ */
public function __construct($seed = 0){ public function __construct($seed = -1){
if($seed == -1){
$seed = time();
}
$this->setSeed($seed); $this->setSeed($seed);
} }
@ -41,8 +47,10 @@ class Random{
* @param int $seed Integer to be used as seed. * @param int $seed Integer to be used as seed.
*/ */
public function setSeed($seed){ public function setSeed($seed){
$seed = 0xffffffff & crc32($seed);
$this->x = $seed ^ 0x0badc0de;
$this->z = $seed ^ 0xdeadbeef; $this->z = $seed ^ 0xdeadbeef;
$this->w = $seed ^ 0xc0de1337; $this->y = $seed ^ 0x12345678;
} }
/** /**
@ -51,7 +59,7 @@ class Random{
* @return int * @return int
*/ */
public function nextInt(){ public function nextInt(){
return Binary::readInt($this->nextBytes(4)) & 0x7FFFFFFF; return $this->nextSignedInt() & 0x7FFFFFFF;
} }
/** /**
@ -60,7 +68,21 @@ class Random{
* @return int * @return int
*/ */
public function nextSignedInt(){ public function nextSignedInt(){
return Binary::readInt($this->nextBytes(4)); $this->x ^= ($this->x << 16);
$this->x ^= ($this->x >> 5);
$this->x ^= ($this->x << 1);
$t = $this->x;
$this->x = $this->y;
$this->y = $this->z;
$this->z = $t ^ $this->x ^ $this->y;
$t = $this->z;
if($t > 2147483647){
$t -= 4294967296;
}
return (int) $t;
} }
/** /**
@ -81,24 +103,6 @@ class Random{
return $this->nextSignedInt() / 0x7FFFFFFF; return $this->nextSignedInt() / 0x7FFFFFFF;
} }
/**
* Returns $byteCount random bytes
*
* @param $byteCount
*
* @return string
*/
public function nextBytes($byteCount){
$bytes = "";
while(strlen($bytes) < $byteCount){
$this->z = 36969 * ($this->z & 65535) + ($this->z >> 16);
$this->w = 18000 * ($this->w & 65535) + ($this->w >> 16);
$bytes .= pack("N", ($this->z << 16) + $this->w);
}
return substr($bytes, 0, $byteCount);
}
/** /**
* Returns a random boolean * Returns a random boolean
* *