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

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

PHP高效产生m个n范围内的不重复随机数(m<=n)的更多相关文章

  1. C#生成指定范围内的不重复随机数

    C#生成指定范围内的不重复随机数 // Number随机数个数 // minNum随机数下限 // maxNum随机数上限 public int[] GetRandomArray(int Number ...

  2. VBA小功能集合-判断列内是否有重复值

    1.判断列内是否有重复值: Dim arrT As Range Dim rng As Range Set arrT = Range("A:A")'判读A列单元格 For Each ...

  3. VBS在指定范围内生成不重复的随机数

    Dim Z()ReDim Z(15)For i=0 To UBound(Z)    Z(i)=GetRndNum(i-1,UBound(Z))    WScript.Echo Z(i)Next Fun ...

  4. 判断List<E>内是否有重复对象

    主要用到Java 8的Stream类 long distinctedSize = list.stream().distinct().count(); boolean hasRepeat = list. ...

  5. 《JavaScript 闯关记》之单体内置对象

    ECMA-262 对内置对象的定义是「由 JavaScript 实现提供的.不依赖于宿主环境的对象,这些对象在 JavaScript 程序执行之前就已经存在了」.意思就是说,开发人员不必显式地实例化内 ...

  6. C++产生随机数

    随机数 计算机的随机数都是由伪随机数,即是由小M多项式序列生成的,其中产生每个小序列都有一个初始值,即随机种子.(注意: 小M多项式序列的周期是65535,即每次利用一个随机种子生成的随机数的周期是6 ...

  7. C 随机不重复元素~转

    随机产生不重复元素:如何高效产生m个n范围内的不重复随机数(m<=n) 如何产生不重复的随机数?最容易想到的方法,是逐个产生这些随机数,每产生一个,都跟前面的随机数比较,如果重复,就重新产生.这 ...

  8. 【转】产生n个100以内的随机数,且不能重复

    如何高效产生m个n范围内的不重复随机数(m<=n) 给出的perl写法,以及 JAVA随机数之多种方法从给定范围内随机N个不重复数 的方法三: /** * 随机指定范围内N个不重复的数 * 在初 ...

  9. java 获取随机数的三种方法

    方法1(数据类型)(最小值+Math.random()*(最大值-最小值+1))例:(int)(1+Math.random()*(10-1+1))从1到10的int型随数 方法2获得随机数for (i ...

随机推荐

  1. HDU 5451 Best Solver 数论 快速幂 2015沈阳icpc

    Best Solver Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 65535/102400 K (Java/Others)Tota ...

  2. Oracle数据库之七 多表查询

    七.多表查询 ​ 对于查询在之前已经学过了简单查询.限定查询.查询排序,这些都属于 SQL 的标准语句,而上一章的单行函数,主要功能是为了弥补查询的不足. ​ 而从多表查询开始就正式进入到了复杂查询部 ...

  3. CCPC-Wannafly Summer Camp #1(部分解题报告)

    A:Birthday 时间限制: 1 Sec  内存限制: 256 MB 题目描述 恬恬的生日临近了.宇扬给她准备了一个大蛋糕. 正如往常一样,宇扬在蛋糕上插了n支蜡烛,并把蛋糕分为m个区域.因为某种 ...

  4. 为什么spark中只有ALS

    WRMF is like the classic rock of implicit matrix factorization. It may not be the trendiest, but it ...

  5. css绝对定位

    绝对定位是我们在使用css时经常使用到的一种布局方式,下面说一下什么是绝对定位. 绝对定位使用position:absolute来定义,首先,要理解的是使用了绝对定位的元素它会脱离文档流,所谓脱离文档 ...

  6. 深度剖析Vue中父给子、子给父、兄弟之间传值!

    本片文章将为您详细讲解在Vue中,父给子传值.子给父传值以及兄弟之间传值方式! 父传子:父组件 // template里面 <aa :info="name"/> // ...

  7. Linux 安装二进制MySQL 及 破解MySQL密码

    1.确保系统中有依赖的libaio 软件,如果没有: yum -y install libaio 2.解压二进制MySQL软件包 tar xf mysql-5.7.24-linux-glibc2.12 ...

  8. 《MySQL实战45讲》学习笔记3——InnoDB为什么采用B+树结构实现索引

    索引的作用是提高查询效率,其实现方式有很多种,常见的索引模型有哈希表.有序列表.搜索树等. 哈希表 一种以key-value键值对的方式存储数据的结构,通过指定的key可以找到对应的value. 哈希 ...

  9. openlivewriter安装配置

    一.前言 最近工作比较忙,同时也在构思下面我应该写哪方面的文章.上一篇文章,我直接在博客园管理后台自带的编辑器写的,确实比较麻烦,于是我就打算使用官方推荐的客户端“Open Live Writer”. ...

  10. android端 版本升级

    由于项目中要求实现版本升级,特写此代码,有因为这段代码基本都是通用,所以记录下来,以便下次直接拷贝... public class ApkVersionUpdate { /** apk文件下载状态:正 ...