问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

PHP产生不重复随机数的5个方法总结

发布网友 发布时间:2022-04-23 13:37

我来回答

2个回答

懂视网 时间:2022-04-28 04:44

php生成不重复随机数的方法:首先为数组的每个数字按其下标顺序赋值;然后开始取“[ i,$num-1 ]”范围内的随机数;最后在未改变的键值对中进行交替运算即可。

推荐:《PHP视频教程》

PHP高效生成一个不重复随机数

PHP生成一个不重复随机数组的封装方法

/*
* array unique_rand( int $min, int $max, int $num )
* 生成一定数量的不重复随机数
* $min 和 $max: 指定随机数的范围
* $num: 指定生成数量
*/
function unique_rand($min, $max, $num) {
//初始化变量为0
$count = 0;
//建一个新数组
$return = array();
while ($count < $num) {
//在一定范围内随机生成一个数放入数组中
$return[] = mt_rand($min, $max);
//去除数组中的重复值用了“翻翻法”,就是用array_flip()把数组的key和value交换两次。这种做法比用 array_unique() 快得多。
$return = array_flip(array_flip($return));
//将数组的数量存入变量count中
$count = count($return);
}
//为数组赋予新的键名
shuffle($return);
return $return;
}

该方法以每次获取随机数存入数组再去重...效率低下...不想用

PHP高效产生m个n范围内的不重复随机数(m<=n)

注:在 《 Programming Pearls 》一书中也有提到,题目为 “如何高效产生m个n范围内的不重复随机数(m<=n)”

该算法非常巧妙的取随机数的位置(数组的下标),替代取随机数本身,每次取到一个随机数之后,就将其在取值范围中排除,下一次仅会在剩下的数字中取,一次遍历就可以完成随机数的选取,效率相当高。

function rand_num($num='200'){
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;
}
}
}

1.第一步,为数组的每个数字按其下标顺序赋值,获得一个 $num 个数字键值对应顺序排列的数组。

2.第二步,开始取范围[ i,$num-1 ]范围内的随机数$rand,并将获取到的随机数$rand作为数组中当前位置 键i对应下标的值$rand,将数组中 键$rand对应下标的值替换为 i,这其实就是数组键值交叉互换。意义是,将已经生成的随机数在取值范围[ i,$num-1 ]中排除,下次会在剩下的数字中[ i+1,num-1 ]取值。

3.第三步,为避免重复取值,只在未改变的键值对中进行交替运算,即在原数组顺序排列 (键==值) 的位置进行交替运算。

4.结束。

顺序排列数组部分交换过程

93e3d00d44adadf8229f5e65e6a1baa.png

如上图,获取10个随机数部分试例。

热心网友 时间:2022-04-28 01:52

无论是Web应用,还是WAP或者移动应用,随机数都有其用武之地。在最近接触的几个小项目中,我也经常需要和随机数或者随机数组打交道,所以,对于PHP如何产生不重复随机数常用的几种方法小结一下(ps:方法1、4、5是我常用的,其余来自网络整理)
方法一:
复制代码
代码如下:
<?php
$numbers
=
range
(1,50);
//shuffle
将数组顺序随即打乱
shuffle
($numbers);
//array_slice
取该数组中的某一段
$num=6;
$result
=
array_slice($numbers,0,$num);
print_r($result);
?>
方法二:
复制代码
代码如下:
<?php
$numbers
=
range
(1,20);
//播下随机数发生器种子,可有可无,测试后对结果没有影响
srand
((float)microtime()*1000000);
shuffle
($numbers);
//跳过list第一个值(保存的是索引)
while
(list(,
$number)
=
each
($numbers))
{
echo
"$number
";
}
?>
方法三:
复制代码
代码如下:
<?php
function
NoRand($begin=0,$end=20,$limit=5){
$rand_array=range($begin,$end);
shuffle($rand_array);//调用现成的数组随机排列函数
return
array_slice($rand_array,0,$limit);//截取前$limit个
}
print_r(NoRand());
?>

上述可以在1-20间随机产生5个不重复的值
方法四:
复制代码
代码如下:
<?php
$tmp=array();
while(count($tmp)<5){
$tmp[]=mt_rand(1,20);
$tmp=array_unique($tmp);
}
print_r($tmp);
?>
方法五:
复制代码
代码如下:
<?php
$tmp
=
range(1,30);
print_r(array_rand($tmp,10));
?>
这个可能是比叫简单的了(ps:如果在range中指定了步长,就必须注意array_rand的第二个参数是否超出$tmp的长度)。
PHP提供非常丰富的数组函数,产生随机数大多可以从数组这个角度出发,若你还有方法提供,欢迎给出,文章将持续更新。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
热血江湖剑客怎么升级快些 三月份有哪些花开花 三月份有哪些花开花呢 三月什么花开的最旺盛呢 请问急性化脓性扁桃体炎期间可不可以食用巧克力? 扁桃体化脓吃什么消炎药 为什么扁桃体发炎或者化脓以后不能喝冷水或者吃辣的东西呢? 扁桃体化脓能吃冰淇淋吗 扁桃体化脓可以吃什么 炸酱面通常使用哪种面条? ...写一篇150词左右的英语短文。 Halloween(万圣节... java中怎样让随机数不重复 如何连续生成不重复的随机数 如何生成6位不重复的随机数 如何生成一定范围内不重复的随机数 吸血虫怎么来源的 C语言如何产生不重复的随机数 如何生成不重复的随机数 谁有钉鞋跑步视频啊? c++中产生不重复的随机数 《鬼吹灯》中的张三爷究竟有多厉害? 什么是放哨火,简要地叙述放哨火这一习俗 室内装修,电视背景墙用镜框线。粘在墙面,还是钉子钉在墙面?若是粘,是原墙,还是腻子,还是乳胶漆上? 谁可以过来帮帮忙,谁知道生活中的小发明? 明朝时期的中国是冷兵器时代还是半火药时代 生活中的小发明 怎么挂小提琴? 如何自制口哨 编,哨,网,漂,举,仗,钉,削,抽,缝,春,夏,由,丰,场,形,男怎么组词语 炒锅里面很脏,如何清理? 哨的形近字 C#如何生成随机不重复的数字 如何高效产生m个n范围内的不重复随机数(m&lt;=n) 如何生成500M不重复的随机数 求一个特定区域内产生随机数不重复的算法。 如何让JAVA生成不重复随机数 快速生成1000万个不重复数字的算法? 如何生成一组不重复的六位随机数 黑龙江省疾控中心短信是真是假 matlab中怎样生成一个区间内不重复的随机数? 黑龙江省疾控中心的短信是什么样的 黑龙江省疾病预防控制中心的职能部门 黑龙江省疾病预防控制中心是什么级别? 黑龙江省防疫站在哪? 黑龙江省疫情防控指挥部是一个什么部门 想知道:从哈尔滨火车站到黑龙江省疾病预防控制中心健康体检中心怎么坐公交? 五常市疾控中心电话? 黑龙江疾控中心检测艾滋病免费吗?坐公交怎么去? ps怎么扣出图里的人? 12320疫苗咨询 求问,黑龙江省哈尔滨市哪里能办健康证,我家在香坊区,听说香坊区油坊街那里能办,具体在哪啊?谁能告诉