求PHP高手解析一下shuffle函数的实现原理
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求PHP高手解析一下shuffle函数的实现原理相关的知识,希望对你有一定的参考价值。
static void php_array_data_shuffle(zval *array TSRMLS_DC) /* */
Bucket **elems, *temp;
HashTable *hash;
int j, n_elems, rnd_idx, n_left;
n_elems = zend_hash_num_elements(Z_ARRVAL_P(array));
if (n_elems < 1)
return;
elems = (Bucket **)safe_emalloc(n_elems, sizeof(Bucket *), 0);
hash = Z_ARRVAL_P(array);
n_left = n_elems;
for (j = 0, temp = hash->pListHead; temp; temp = temp->pListNext)
elems[j++] = temp;
while (--n_left)
rnd_idx = php_rand(TSRMLS_C);
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;
HANDLE_BLOCK_INTERRUPTIONS();
hash->pListHead = elems[0];
hash->pListTail = NULL;
hash->pInternalPointer = hash->pListHead;
for (j = 0; j < n_elems; j++)
if (hash->pListTail)
hash->pListTail->pListNext = elems[j];
elems[j]->pListLast = hash->pListTail;
elems[j]->pListNext = NULL;
hash->pListTail = elems[j];
temp = hash->pListHead;
j = 0;
zend_hash_reindex(hash, 0);
HANDLE_UNBLOCK_INTERRUPTIONS();
efree(elems);
/* */
/* proto bool shuffle(array array_arg)
Randomly shuffle the contents of an array */
PHP_FUNCTION(shuffle)
zval *array;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a", &array) == FAILURE)
RETURN_FALSE;
php_array_data_shuffle(array TSRMLS_CC);
RETURN_TRUE;
/* */
这段代码是shuffle的函数定义
高手们应该很容易就会找到
为了方便大家看我也顺便帖出来了
我想问的是
这段代码实现随机的原理是根据不同的时间种子
就是说在不同时间执行这段代码会有不同结果
还是不是根据时间的
而且根据其他什么东西来实现随机的
先谢谢各位
希望可以帮到你。望采纳。追问
那再请问rand函数是根据什么实现随机的?
追答你好,rand是php内置函数,属于底层问题,原理是cpu调度执行是随即的 多线程执行就是CPU 随机执行,只要把每一个数交给CPU 执行多线程 实现随即。其实我们只要学会有怎么用在大型项目中就行了,没必要刨根问底。希望能帮助到你,望采纳!
参考技术A shuffle就是shuffle算法,实现原理需要有高数基础,你有兴趣可以直接搜shuffle算法php函数-shuffle
Shuffle()函数说明:
-随机乱序现有数组并不保留键值:
-shuffle()函数把数组中的元素按随机顺序重新排列,该函数为数组中的元素分配新的键名,已有键名将被删除。
语法说明:
shuffle(array)
其中,array是规定要使用的数组。
关于返回值:成功则返回TRUE,失败则返回FALSE
demo:
$my_array = array("a"=>"red","b"=>"green","c"=>"blue","d"=>"yellow","e"=>"purple"); shuffle($my_array); print_r($my_array); ?>
输出结果:
Array ( [0] => purple [1] => blue [2] => yellow [3] => green [4] => red )
注意,根据结果我们发现,首先,乱序,其次,键值被重置。
以上是关于求PHP高手解析一下shuffle函数的实现原理的主要内容,如果未能解决你的问题,请参考以下文章
MapReduce 框架原理MapReduce 工作流程 & Shuffle 机制