diff options
author | Dan Kalowsky <kalowsky@php.net> | 2002-08-15 19:09:05 +0000 |
---|---|---|
committer | Dan Kalowsky <kalowsky@php.net> | 2002-08-15 19:09:05 +0000 |
commit | dee21adc3da7e8119b90cab9a33e91b865dad4e3 (patch) | |
tree | 0a34c2ea615dc74e016dec08aba15a1194d2a5ee /ext/standard/array.c | |
parent | 993d235c07e30568f2d04b169fcf36e0f24c713a (diff) | |
download | php-git-dee21adc3da7e8119b90cab9a33e91b865dad4e3.tar.gz |
Fix for bug #18401, makes shuffle() properly generate all possibilities.
Patch provided by Adam Trachtenberg <adam@trachtenberg.com>
Diffstat (limited to 'ext/standard/array.c')
-rw-r--r-- | ext/standard/array.c | 11 |
1 files changed, 5 insertions, 6 deletions
diff --git a/ext/standard/array.c b/ext/standard/array.c index 0c8ad6c111..de666674f3 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -1441,7 +1441,7 @@ static void array_data_shuffle(zval *array TSRMLS_DC) { Bucket **elems, *temp; HashTable *hash; - int j, n_elems, cur_elem = 0, rnd_idx, n_left; + int j, n_elems, rnd_idx, n_left; n_elems = zend_hash_num_elements(Z_ARRVAL_P(array)); @@ -1457,13 +1457,12 @@ static void array_data_shuffle(zval *array TSRMLS_DC) elems[j++] = temp; while (--n_left) { rnd_idx = php_rand(TSRMLS_C); - RAND_RANGE(rnd_idx, cur_elem, n_left, PHP_RAND_MAX); - if (rnd_idx != cur_elem) { - temp = elems[cur_elem]; - elems[cur_elem] = elems[rnd_idx]; + RAND_RANGE(rnd_idx, 0, n_left, PHP_RAND_MAX); + if (rnd_idx != n_left) { + temp = elems[n_left]; + elems[n_left] = elems[rnd_idx]; elems[rnd_idx] = temp; } - cur_elem++; } HANDLE_BLOCK_INTERRUPTIONS(); |