|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2008-11-17 02:50 UTC] 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
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Fri Oct 24 06:00:01 2025 UTC |
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()