如何在php中取随机数不重复

  介绍

如何在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中取随机数不重复