Re: #18401 [Opn->Ana]: shuffle() broken (fwd)

From: Date: Fri, 16 Aug 2002 01:37:36 +0000
Subject: Re: #18401 [Opn->Ana]: shuffle() broken (fwd)
References: 1  Groups: php.dev 
Request: Send a blank email to php-dev+get-86883@lists.php.net to get a copy of this message
Dan Kalowsky wrote:
Anyone able to confirm or deny the validity of this patch? ---------- Forwarded message ---------- [2002-07-18 01:03:51] adam@trachtenberg.com The shuffle() function in the CVS is (still) broken. It does not correctly generate all possible combinations of the array. (I know this function was recently updated, this test is with new version.) Here is a diff to fix the problem: --- array.c Thu Jul 18 00:50:54 2002 +++ array.new.c Thu Jul 18 00:49:35 2002 @@ -1441,7 +1441,7 @@ { 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 @@ 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();
I've send the message to Dan, already. Just posting php-dev again. Top elements have more chance than end elements. All elements should have equal chance to be shuffled. -- Yasuo Ohgaki

« previous php.dev (#86883) next »