Edit report at http://bugs.php.net/bug.php?id=46587&edit=1

 ID:                 46587
 Comment by:         belov1985 at gmail dot com
 Reported by:        atomo64 at gmail dot com
 Summary:            mt_/rand produce out of range numbers when min = 0
                     and max > get_randmax
 Status:             Closed
 Type:               Bug
 Package:            Math related
 Operating System:   Debian sid
 PHP Version:        5.2.6
 Assigned To:        iliaa
 Block user comment: N
 Private report:     N

 New Comment:

Arr.. I use this feature five years!! ]:->



mt_rand(0, 10) - works, but mt_rand(10, 0) - why no? it's great, that
there is no need to check min & max...



WBR, Konstantin


Previous Comments:
------------------------------------------------------------------------
[2010-11-25 17:44:24] cataphr...@php.net

Automatic comment from SVN on behalf of cataphract
Revision: http://svn.php.net/viewvc/?view=revision&revision=305754
Log: - Fixed bug #53403 (use of unitialized values). Fixes the fix for
bug #46587.
- Added test for bug #46587.

------------------------------------------------------------------------
[2010-11-23 14:09:23] il...@php.net

This bug has been fixed in SVN.

Snapshots of the sources are packaged every three hours; this change
will be in the next snapshot. You can grab the snapshot at
http://snaps.php.net/.
 
Thank you for the report, and for helping us make PHP better.



------------------------------------------------------------------------
[2010-11-23 14:09:17] il...@php.net

Automatic comment from SVN on behalf of iliaa
Revision: http://svn.php.net/viewvc/?view=revision&revision=305692
Log: Fixed bug #46587 (mt_rand() does not check that max is greater than
min).

------------------------------------------------------------------------
[2009-03-09 14:06:58] mmcnickle at gmail dot com

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()

------------------------------------------------------------------------
[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/bug.php?id=46587&edit=1

Reply via email to