com php-src: Fix #71152: mt_rand() returns the diff erent values from original mt19937ar.c: ext/standard/rand.c ext/standard/tests/math/mt_rand_
value.phpt

From: Date: Thu, 17 Dec 2015 19:14:40 +0000
Subject: com php-src: Fix #71152: mt_rand() returns the diff erent values from original mt19937ar.c: ext/standard/rand.c ext/standard/tests/math/mt_rand_
value.phpt
Groups: php.cvs 
Request: Send a blank email to php-cvs+get-91073@lists.php.net to get a copy of this message
Commit: d31e8a9a85efea54db0b647424f6c4485d71db8b Author: kusano <kusano@users.noreply.github.com> Thu, 17 Dec 2015 19:26:38 +0900 Parents: 817ed01320cd0c6ce3d36b06d760d91a748f1a56 Branches: master Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=d31e8a9a85efea54db0b647424f6c4485d71db8b Log: Fix #71152: mt_rand() returns the different values from original mt19937ar.c Bugs: https://bugs.php.net/71152 Changed paths: M ext/standard/rand.c A ext/standard/tests/math/mt_rand_value.phpt Diff: diff --git a/ext/standard/rand.c b/ext/standard/rand.c index b80318c..9ec7241 100644 --- a/ext/standard/rand.c +++ b/ext/standard/rand.c @@ -146,7 +146,7 @@ PHPAPI zend_long php_rand(void) #define loBits(u) ((u) & 0x7FFFFFFFU) /* mask the highest bit of u */ #define mixBits(u, v) (hiBit(u)|loBits(v)) /* move hi bit of u to hi bit of v */ -#define twist(m,u,v) (m ^ (mixBits(u,v)>>1) ^ ((php_uint32)(-(php_int32)(loBit(u))) & 0x9908b0dfU)) +#define twist(m,u,v) (m ^ (mixBits(u,v)>>1) ^ ((php_uint32)(-(php_int32)(loBit(v))) & 0x9908b0dfU)) /* {{{ php_mt_initialize */ diff --git a/ext/standard/tests/math/mt_rand_value.phpt b/ext/standard/tests/math/mt_rand_value.phpt new file mode 100644 index 0000000..eeb009e --- /dev/null +++ b/ext/standard/tests/math/mt_rand_value.phpt @@ -0,0 +1,53 @@ +--TEST-- +Test mt_rand() - returns the exact same values as mt19937ar.c +--FILE-- +<?php + +mt_srand(12345678); + +for ($i=0; $i<16; $i++) { + echo mt_rand().PHP_EOL; +} +echo PHP_EOL; + +$x = 0; +for ($i=0; $i<1024; $i++) { + $x ^= mt_rand(); +} +echo $x.PHP_EOL; + +/* +excpect values are obtained from original mt19937ar.c as follows: + +int i, x; +init_genrand(12345678); +for (i=0; i<16; i++) { + printf("%d\n", genrand_int31()); +} +printf("\n"); +x = 0; +for (i=0; i<1024; i++) { + x ^= genrand_int31(); +} +printf("%d\n", x); +*/ +?> +--EXPECTF-- +527860569 +1711027313 +1280820687 +688176834 +770499160 +412773096 +813703253 +898651287 +52508912 +757323740 +511765911 +274407457 +833082629 +1923803667 +1461450755 +1301698200 + +1612214270

« previous php.cvs (#91073) next »