ID: 46587 Comment by: mmcnickle at gmail dot com Reported By: atomo64 at gmail dot com Status: Assigned Bug Type: Math related Operating System: Debian sid PHP Version: 5.2.6 Assigned To: pajoye New Comment:
The problem is that there is an integer overflow on UL: ------------ <?php define('UL',mt_getrandmax() + 1000); var_dump(UL, (int)UL); ------------ will produce ------------ float(2147484647) int(-2147482649) ------------ The $min and $max parameter names on mt_rand() (and rand()) are misleading, as $min can be larger than $max and mt_rand will produce a correct value between $min and $max. In the bug example, the expected result is returned: a random value between -2147482649 and 0. If you want to change the integer overflow behaviour, it would be best to do a check using mt_getrandmax() in the PHP code: <?php $max = mt_getrandmax() + 1000; if ($max > mt_getrandmax()) { $max = mt_getrandmax(); } $r = mt_rand(0, $max); // $r is now a number between 0 and mt_getrandmax() Previous Comments: ------------------------------------------------------------------------ [2008-11-17 02:50:20] atomo64 at gmail dot com Description: ------------ Whenever min is set to 0 and max is set to anything greater than getrandmax (or the mt_ version) the returned PRN is always (despite the upper limit check in the example code) a number minor than 0. Reproduce code: --------------- define("UL", mt_getrandmax()+1000); $r=mt_rand(0, UL); if ($r < 0 || $r > UL) echo "Random value out of range\n"; Expected result: ---------------- No output Actual result: -------------- Random value out of range ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/?id=46587&edit=1