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

如何在php中取随机数不重复?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

创新互联公司网站建设公司,提供成都网站设计、做网站,网页设计,建网站,PHP网站建设等专业做网站服务;可快速的进行网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,是专业的做网站团队,希望更多企业前来合作!

php取随机数不重复的方法:1、使用【rand(min,max)】函数产生随机数;2、使用【array_unique(arr)】对生成的数组进行去重;3、利用索引快速的生成不重复的随机数。

php取随机数不重复的方法:

首先想到的是rand(min,max)函数产生随机数,实际上使用mt_rand(min,max)能更加迅速的产生随机数。

其次使用array_unique(arr)对生成的数组进行去重,实际上使用array_flip(array_flip(arr))能更加快速的进行去重。

了解以上两点我们便可以写一个稍微优化过的函数:

/**
 * 生成指定长度不重复的字符串.
 *
 * @param integer $min 最小值.
 * @param integer $max 最大值.
 * @param integer $len 生成数组长度.
 *
 * @return array
 */
function uniqueRandom($min, $max, $len)
{
    if ($min < 0 || $max < 0 || $len) {
        throw new LogicException('无效的参数');
    }
    if ($max <= $min) {
        throw new LogicException('大小传入错误');
    }
    $counter = 0;
    $result = array();
    while ($counter < $len) {
        $result[] = mt_rand($min, $max);
        $result = array_flip(array_flip($result));
        $counter = count($result);
    }
    shuffle($result);
    return $result;
}

其实可以利用索引来更加快速的生成不重复的随机数,且效率甩上面函数几条街。

/**
 * 生成指定长度不重复的字符串.
 *
 * @param integer $min 最小值.
 * @param integer $max 最大值.
 * @param integer $len 生成数组长度.
 *
 * @return array
 */
function uniqueRandom2($min, $max, $len)
{
    if ($min < 0 || $max < 0 || $len < 0) {
        throw new LogicException('无效的参数');
    }
    if ($max <= $min) {
        throw new LogicException('大小传入错误');
    }
    if (($max - $min + 2) < $len) {
        throw new LogicException("传入的范围不足以生成{$len}个不重复的随机数}");
    }
    $index = array();
    for ($i = $min; $i < $max + 1; $i++) {
        $index[$i] = $i;
    }
    $startOne = current($index);
    $endOne = end($index);
    for ($i = $startOne; $i < $endOne; $i++) {
        $one = mt_rand($i, $max);
        if ($index[$i] == $i) {
            $index[$i] = $index[$one];
            $index[$one] = $i;
        }
    }
    return array_slice($index, 0, $len);
}

该算法与上面算法相比巧妙之处在于:

  • 对自增索引进行随机,不会有重复的问题,避免了去重的开销

  • 用数组下标替代数组本身进行随机,每取到一个随机数后就将其在取值范围中排除,下一次仅会在剩下的数字中取,一次遍历就可以完成随机数的选取。

看完上述内容,你们掌握如何在php中取随机数不重复的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注创新互联行业资讯频道,感谢各位的阅读!


网站栏目:如何在php中取随机数不重复
分享路径:http://scyanting.com/article/ipdgse.html