#22988 [Opn]: I'm feeling lucky - rand() bug

From: Date: Tue, 06 May 2003 19:29:27 +0000
Subject: #22988 [Opn]: I'm feeling lucky - rand() bug
References: 1  Groups: php.doc 
Request: Send a blank email to phpdoc+get-969353217@lists.php.net to get a copy of this message
ID: 22988 User updated by: vakmajom at freemail dot hu Reported By: vakmajom at freemail dot hu Status: Open Bug Type: Documentation problem Operating System: Windows 2000 PHP Version: 4.3.2RC1 Assigned To: pollita New Comment: Why it is a Windows bug? Because RAND_MAX is not 2147483647? Alrigth then. But the documentation should also mention that you must not call rand(min, max) or mt_rand(min, max) if (max-min > 2147483647) (on unix systems you get a Warning message (tested with PHP 4.1.0), but on Windows systems mt_rand(-2147483648, 2147483647) simply returns -2147483648, without any warning message - as I explained. Previous Comments: ------------------------------------------------------------------------ [2003-04-26 16:56:07] pollita@php.net Actually the docs should mention this. Reclassifying and opening back up. ------------------------------------------------------------------------ [2003-04-26 16:55:38] pollita@php.net After discussion it looks like PHP won't be getting into the business of fixing windows bugs :) As you suggested the best bet is to stick with mt_rand() to get the resulution you're looking for. ------------------------------------------------------------------------ [2003-04-18 00:03:55] pollita@php.net I can see where you were going with that, unfortunately it has the unexpected result of simply chaning the bug so that only *odd* numbers get returned.... I'm still thinking over this one and hope you give it some more thought too.... :) ------------------------------------------------------------------------ [2003-04-17 11:06:09] vakmajom at freemail dot hu About the original bug... Nothing has happened since April 1st, so i browsed the source code a little bit: I think it is not just a carryover bug, it is more than that. It is because RAND_MAX on Windows, and RAND_RANGE. The problem is the follownig: On Windows systems RAND_MAX is 32767, so only 32768 values can be returned if I call rand(1, 2147483647) from a PHP script. That's why rand(1, 2147483647) or rand(1, 65535) returns always an even number. Maybe a RAND_MAX specific hack to the code: e.g. calling rand() three times and creating a 45 bit random value and then reducing it to a 32bit one, or somthing like that would help, but this would dirty the code... Alright, let's use mt_rand(), it is a 31 bit random number on every system, and it is better than a 15 bit random number... So if I call mt_rand(-2147483648, 2147483647) then I should get 2147483648 results. This is less than it should (4294967296), but more than 32768. And now, the suprise: the result is always the same: -2147483648. This IS a carryover bug, and unless I am mistaken it can be solved by changing line 43 in file ext/standard/php_rand.h from (__n) = (__min) + (long) ((double) ((__max) - (__min) + 1.0) * ((__n) / ((__tmax) + 1.0))) to (__n) = (__min) + (long) ((double) ((double)(__max) - (__min) + 1.0) * ((__n) / ((__tmax) + 1.0))) ------------------------------------------------------------------------ [2003-04-01 08:01:28] vakmajom at freemail dot hu Sorry: srand((double)microtime()*100000); ------------------------------------------------------------------------ The remainder of the comments for this report are too long. To view the rest of the comments, please view the bug report online at http://bugs.php.net/22988 -- Edit this bug report at http://bugs.php.net/?id=22988&edit=1

« previous php.doc (#969353217) next »