介绍
如何在php中取随机数不重复?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
php取随机数不重复的方法:1、使用【兰德(最小,最大)】函数产生随机数;2、使用【array_unique (arr)】对生成的数组进行去重;3,利用索引快速的生成不重复的随机数。
引用><强> php取随机数不重复的方法:强>
首先想到的是<代码>兰德(最小,最大)代码>函数产生随机数,实际上使用<代码> mt_rand(最小,最大)代码>能更加迅速的产生随机数。
其次使用<代码> array_unique (arr) 代码>对生成的数组进行去重,实际上使用<代码> array_flip (array_flip (arr))> 代码能更加快速的进行去重。
了解以上两点我们便可以写一个稍微优化过的函数:
/* * *生成指定长度不重复的字符串。 * * @param美元整数最小最小值。 * @param美元整数最大最大值。 * @param美元整数len生成数组长度。 * * @return数组 */函数uniqueRandom (min,马克斯,美元len美元) { if($分钟& lt;0 | | $马克斯& lt;0 | | $ len) { 把新LogicException(& # 39;无效的参数& # 39;); } 如果(max & lt;美元=$ min) { 把新LogicException(& # 39;大小传入错误& # 39;); } $ counter=0; $=结果数组(); 而($ counter & lt;len美元){ 美元的结果[]=mt_rand (min,马克斯美元); 结果美元=array_flip (array_flip(结果)美元); $ counter=count($结果); } 洗牌(结果); 返回结果美元; }其实可以利用索引来更加快速的生成不重复的随机数,且效率甩上面函数几条街。
/* * *生成指定长度不重复的字符串。 * * @param美元整数最小最小值。 * @param美元整数最大最大值。 * @param美元整数len生成数组长度。 * * @return数组 */函数uniqueRandom2 (min,马克斯,美元len美元) { if($分钟& lt;0 | | $马克斯& lt;0 | | $ len & lt;0){ 把新LogicException(& # 39;无效的参数& # 39;); } 如果(max & lt;美元=$ min) { 把新LogicException(& # 39;大小传入错误& # 39;); } 如果((max - min美元+ 2)& lt;len美元){ 把新的LogicException(“传入的范围不足以生成{$ len}个不重复的随机数}“); } 美元指数=array (); (i=美元最小;美元我& lt;max + 1美元;$我+ +){ 美元指数($ i)=$我; } (startOne=当前美元指数); (endOne=结束美元指数); (i=startOne美元;美元我& lt;endOne美元;$我+ +){ 一美元=mt_rand(我,马克斯美元); 如果(美元指数($ i)==$ i) { 美元指数($ i)=美元指数(1美元); 美元指数(1美元)=$ i; } } 返回array_slice(美元指数,0,len美元); }该算法与上面算法相比巧妙之处在于:
<李>
对自增索引进行随机,不会有重复的问题,避免了去重的开销
李> <李>用数组下标替代数组本身进行随机,每取到一个随机数后就将其在取值范围中排除,下一次仅会在剩下的数字中取,一次遍历就可以完成随机数的选取。
李>引用>
如何在php中取随机数不重复