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

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. Codeforces Round #480 (Div. 2) A. Links and Pearls

    题目地址:http://codeforces.com/contest/980/problem/A 官方题解: 我的理解:o表示珍珠,-表示链子,给一串字符串你可以任意重组这条项链(不能删去),判断这条 ...

  2. Dungeon Master POJ - 2251 [kuangbin带你飞]专题一 简单搜索

    You are trapped in a 3D dungeon and need to find the quickest way out! The dungeon is composed of un ...

  3. Android-友盟第三方登录与分享

    ### 前言 最近项目中又一次需要集成友盟的三方登录与分享,之前没有记录过,所以这次来写一下... ### 准备工作 1.注册友盟账号创建应用,获取key:申请地址http://www.umeng.c ...

  4. 单细胞转录组测序数据的可变剪接(alternative splicing)分析方法总结

    可变剪接(alternative splicing),在真核生物中是一种非常基本的生物学事件.即基因转录后,先产生初始RNA或称作RNA前体,然后再通过可变剪接方式,选择性的把不同的外显子进行重连,从 ...

  5. IDEA新建一个最简单的Maven的JavaWeb项目

    1.项目环境 IDEA:2016.2 JDK:1.8.0_76 Maven:3.2.5 2.File-->New-->Project-->Maven 3.选择Project SDK: ...

  6. Maven学习归纳(二)——几个常用命令解析

    Maven的常用命令 第一次执行命令的时候,因为需要下载执行命令的基础环境,所以会从远程仓库下载该环境到本地仓库中 运行mvn命令,必须在pom.xml文件所在的目录 一. JavaProject的p ...

  7. .Net基础篇_学习笔记_第六天_for循环的嵌套_乘法口诀表

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  8. mysql生成主键

    在mysql中,可以使用uuid 来生成主键,但是用mysql的uuid()函数 ,生成的uuid是36位的,其中包含32个字符以及4个分隔符(-), 往往这个分隔符对我们来说是没有用的,可以使用my ...

  9. linux无法用root账号ssh登录(putty)

    解决方法: 在kali打开终端,修改ssh配置文件. vi /etc/ssh/sshd_config 将PermitRootLogin, 改成PermitRootLogin yes.(允许用root登 ...

  10. Swift从入门到精通第十五篇 - 类型转换 初识

    类型转换(学习笔记) 环境Xcode 11.0 beta4 swift 5.1 类型转换 类型转换是检查实例类型的一种方法,或者检查来自类层级不同的父类或子类一个实例,用 is 和 as 操作符 为类 ...