php生成不重复随机数组
php生成不重复随机数组
没啥说的,直接上基础代码:
/*
$min 和 $max: 指定随机数的范围
$num:指定生成数量
*/
function rand_num($min, $max, $num){
$count = 0;
$return = array();
while($count < $num){
$return[] = mt_rand($min, $max);
//去重
$return = array_flip(array_flip($return));
//存入数量
$count = count($return);
}
//给数组新的键名
shuffle($return);
return $return;
}
上面的方法是每次获取随机数存入数组再去重,效率不是很高,新的方法如下:
function rand_num($num){
for($i = 0; $i < $num; $i++){
$n[$i] = $i;
}
for($i = 0; $i < $num; $i++){
$rand = mt_rand($i, $num-1);
//数组 随机数交换下标
if($n[$i] == $i){
$n[$i] = $n[$rand];
$n[$rand] = $i;
}
}
}
新方法说明 :
NO1:为数组的每个数字按其下标顺序赋值,获得一个$num个数字键值对应顺序排列的数组;
NO2:取值范围[$i, $num-1]内的随机数$rand,将数组键值交叉互换,作用是将已经生成的随机数在取值范围[$i, $num-1]中排除,下次会在剩下的数字[$i+1, $num-1]取值
NO3:为避免重复取值,只在未改变的键值对中进行交替运算,即在原数组顺序排列的位置进行交替运算