所有分类
  • 所有分类
  • 后端开发
深入探究 PHP 中 shuffle()函数的内部机制与 Fisher-Yates 算法

深入探究 PHP 中 shuffle()函数的内部机制与 Fisher-Yates 算法

数组打乱顺序的随机性。算法,通过交换元素的方式打乱数组顺序。函数可以打乱数组的顺序。该算法通过依次交换元素来打乱数组顺序。函数打乱数组顺序:运行以上代码会输出打乱顺序后的数组。函数使用伪随机算法,但通过使用随机种子或自定义洗牌算法,可以控制

身为PHP程序员,整天都在摆弄数组。有天突然想知道PHP里那个叫shuffle()的玩意儿能不能控制随机性。这篇文章就是聊聊自己的一些研究心得,希望其他码农们也能有所收益。

shuffle()函数的内部机制

深入探究 PHP 中 shuffle()函数的内部机制与 Fisher-Yates 算法

PHP的shuffle()用的就是那个Fisher-Yates洗牌法,这东西主要就是靠着随机换数组里的元素来搅乱原来的次序。说白了,就是随机找个没动过的元素跟末尾的那个元素互换。一直这么换,直到整个数组都翻新一遍就好了。

Fisher-Yates算法的详细步骤

这个Fisher-Yates算法挺简单的,就是一直挑来换去。开始时,我们先从第一位开始,然后随机选下一位和它打个照面。就这么来回,每一次转动,每个数字都有可能跑到任意一个地方。这样最后出来的结果就是纯属随机的!

shuffle()函数的随机性问题

即使shuffle()这个东西真的挺实用,但是它的杂乱无章其实还是有原因的。它主要就是依赖着PHP那玩意儿来搞定这个事情,也就是随机数的产生。所以说,如果你啥也不管的话,每当你用shuffle(),结果总是五花八门。

控制随机性的方法:使用随机种子

你想让shuffle()函数变得可控吗?很简单!只需用mt_srand()函数给它设定一颗“种子”(也就是开始的数值),然后再次运行程序,就能得到同样的随机数列了。这对程序员来说尤其方便,因为他们经常需要反复测试代码。

控制随机性的方法:自定义洗牌算法

不靠随机种子的话,咱也能弄出洗牌算法来。比如写个特定的洗牌函数,就能对随机性有更深的把握了。比如咱们想换掉数组里多少个元素就换多少,或者用别的方式搞点随机数出来。


实战案例:使用随机种子控制shuffle()函数的随机性

我写了个小PHP脚本来演示如何用随机种子来控制shuffle()的随机性。先通过mt_srand()给randomseed打下基础,然后就可以安心地启动shuffle()。反复试过之后发现,不管运行几次,数组都能保持同样的混乱状态。

实战案例:实现自定义洗牌算法

另一个例子就是做一个自定义的洗牌算法。这次,我搞了个功能强大的函数,它能选好数组中的元素然后随机地交换位置,甚至能根据数组的长度来决定随机性到底有多强。这样的话,就算不是全随机的,也能让数组顺序看起来很神秘!

结论和个人体会

通过研究这些问题,我搞清楚了PHP里那个叫shuffle()的函数怎么随机运行,还学会了怎么控制它。这样以后我就能更自由地用到这个功能,同时也加深了对乱数产生道理的理解。希望我讲的经验,能帮到别的程序员们。

发问你啦:你有没有搞不定随机性这玩意儿的时候?你都是怎么应对的呀?快来给大伙儿分享一下你的经验~别忘了给这篇文章点个赞!

原文链接:https://www.icz.com/technicalinformation/web/2024/06/16561.html,转载请注明出处~~~
0

评论0

请先
注意:请收藏好网址www.icz.com,防止失联!站内免费资源持续上传中…!赞助我们
显示验证码
没有账号?注册  忘记密码?