Fix #71152: mt_rand() returns the different values from original mt19937ar.c

This commit is contained in:
kusano 2015-12-17 19:26:38 +09:00
parent 817ed01320
commit d31e8a9a85
2 changed files with 54 additions and 1 deletions

View file

@ -146,7 +146,7 @@ PHPAPI zend_long php_rand(void)
#define loBits(u) ((u) & 0x7FFFFFFFU) /* mask the highest bit of u */ #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 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 /* {{{ php_mt_initialize
*/ */

View file

@ -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