求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的函数定义
高手们应该很容易就会找到
为了方便大家看我也顺便帖出来了

我想问的是
这段代码实现随机的原理是根据不同的时间种子
就是说在不同时间执行这段代码会有不同结果
还是不是根据时间的
而且根据其他什么东西来实现随机的
先谢谢各位

你好,shuffle函数是随机变换数组元素位置,其实思路很简单,我们知道数组都可以计算其长度,$len=count($array)以后,我们只要用循环配合rand(0,$len)随机出一个位置,保存到一个新数组当中,因为在循环中,随机出来的位置可能一样,这时判断该随机位置有没在数组中,若有继续rand,没有则存进数组,直到个数够了,然后在逐个array【位置】,这样每次只有刷新,数组位置就发生变换,用手机敲代码太慢了,若要代码,可联系我扣扣185 3953 618
希望可以帮到你。望采纳。追问

那再请问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 机制

Spark Shuffle原理解析

请教一下是啥错误怎么解决,是在测试ehcache分布式缓存中出现的 求高手 重金

php函数漏洞原理解析

php保留键随机打乱数组顺序

php分页原理,懂得的指教一下哈!