On Sun, Jan 11, 2015 at 2:12 PM, Andrea Faulds <a...@ajf.me> wrote: > Hey internals, > > As we’re moving to clean some things up in PHP 7, I think it might be worth > looking at the rand()/mt_rand() situation. > > Currently, we have two standard-library functions to obtain a random number: > rand() and mt_rand(). rand() uses the C standard library function, which on > many stdlibs is slow or has a limited range (e.g. Win32 rand()’s maximum > return value is SHORT_MAX). As a result, a drop-in replacement was added, > mt_rand(), which uses Mersenne Twister-based random number generator that’s > probably better than what the C standard library provides. > > Having two different random number functions is confusing to new users, and > an oft-cited issue with PHP’s standard library. Intuitively, a user would > expect rand() to be the function to get a random number, but actually they > should be using mt_rand(), which is usually better. > > Another issue is the fact we allow random numbers to be seeded with srand() > and mt_srand(). We have automatically seeded the random number generator for > a while now, so there is no need to do it manually. We also explicitly do not > guarantee that the random number generator will always produce the same > output given the same seed, and in fact we’ve changed mt_rand()'s behaviour > in the past. This eliminates the primary use-case for manual seeding when > there is automatic seeding: predictable output for procedural generation. > > Finally, a third issue is that mt_rand() does not produce good quality > numbers on 64-bit platforms. mt_rand() will always produce a 32-bit value > internally, and scale it up or down to fit the user-specified range. > Unfortunately, this means that values for the $max parameter beyond 2^31 - 1 > produce numbers with poor granularity. > > Given all these, I would suggest that for PHP 7, we: > > * Get rid of rand(), srand() and getrandmax() > * Rename mt_rand(), mt_srand() and mt_getrandmax() to rand(), srand(), and > getrandmax() but add mt_* aliases for backwards-compatibility > * Make mt_srand() and srand() do nothing and produce a deprecation notice > * Use a 64-bit random number generation algorithm on 64-bit platforms (or > invoke the 32-bit generator twice) > > The end result should be that PHP has just one random number generation > function, rand(), which can produce the full range from PHP_INT_MIN to > PHP_INT_MAX with no scaling. This would be far more intuitive, I think. > > Would that sound good?
I am all in favor of having new RNG functions to make it easier and safer to use RNG with PHP. However, I can only confirm what Rasmus said. Removing them is absolutely not an option. There are dozen of valid usages of these functions, from game engines to image processing via data simulation. Dropping them or changing how they work will be a major pain for many of these cases and a show stopper to upgrade to 7. Let not do that please. Cheers, -- Pierre @pierrejoye | http://www.libgd.org -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php