JavaScript 产生不重复的随机数三种实现思路


Posted in Javascript onDecember 13, 2012

在 JavaScript 中,一般产生的随机数会重复,但是有时我们需要不重复的随机数,如何实现?下面就来讲解三种方法产生不重复的随机数,并进行比较,看那种方法效率高。

方法一
思路:首先创建一个1到3000的数组,每次取一个数,然后去除数组中取出的这个数, 这样就可以实现永不重复。

<script type="text/javascript"> 
var count=3000; 
var originalArray=new Array;//原数组 
//给原数组originalArray赋值 
for (var i=0;i<count;i++){ 
originalArray[i]=i+1; 
} 
var d1=new Date().getTime(); 
for (i=0;i<count;i++){ 
var index=Math.floor(Math.random()*originalArray.length); //随机取一个位置 
document.write(index+" , "); 
originalArray.splice(index,1); 
} 
var d2=new Date().getTime(); 
document.write("运算耗时"+(d2-d1)); 
</script>

性能:耗时 1528 毫秒。

方法二
思路:对方法一的slice方法进行改进,以提高效率。还是从原数组取出一个数, 然后让原数组的这个位置赋值为null 。下一次取数时判断是否为null,如果是null就不取。

<script type="text/javascript"> 
var count=3000; 
var originalArray=new Array;//原数组 
//给原数组originalArray赋值 
for (var i=0;i<count;i++){ 
originalArray[i]=i+1; 
} 
var d1=new Date().getTime(); 
for (var num,i=0;i<count;i++){ 
do{ 
num=Math.floor(Math.random()*count); 
}while(originalArray[num]==null); 
document.write(originalArray[num]+" , "); 
originalArray[num]=null; 
} 
var d2=new Date().getTime(); 
document.write("运算耗时"+(d2-d1)); 
</script>

性能:耗时 290 毫秒。

方法三
思路:把原数组打散,然后再依次输出, 这样也可以做到随机永不重复,且效率更高。

<script type="text/javascript"> 
var count=3000; 
var originalArray=new Array;//原数组 
//给原数组originalArray赋值 
for (var i=0;i<count;i++){ 
originalArray[i]=i+1; 
} 
var d1=new Date().getTime(); 
originalArray.sort(function(){ return 0.5 - Math.random(); }); 
for (var i=0;i<count;i++){ 
document.write(originalArray[i]+" , "); 
} 
var d2=new Date().getTime(); 
document.write("运算耗时"+(d2-d1)); 
</script>

性能:耗时 229 毫秒。
通过性能分析,得出方法三为最佳方案。
Javascript 相关文章推荐
fmt:formatDate的输出格式详解
Jan 09 Javascript
jquery实现背景墙聚光灯效果示例分享
Mar 02 Javascript
JS中递归函数
Jun 17 Javascript
JavaScript中日常收集常见的10种错误(推荐)
Jan 08 Javascript
Angularjs中的验证input输入框只能输入数字和小数点的写法(推荐)
Aug 16 Javascript
vue轮播图插件vue-awesome-swiper
Nov 27 Javascript
详解AngularJS之$window窗口对象
Jan 17 Javascript
d3绘制基本的柱形图的实现代码
Dec 12 Javascript
浅谈Fetch 数据交互方式
Dec 20 Javascript
vue请求数据的三种方式
Mar 04 Javascript
Javascript摸拟自由落体与上抛运动原理与实现方法详解
Apr 08 Javascript
使用vue引入maptalks地图及聚合效果的实现
Aug 10 Javascript
Javascript Boolean、Nnumber、String 强制类型转换的区别详细介绍
Dec 13 #Javascript
js onkeypress与onkeydown 事件区别详细说明
Dec 13 #Javascript
javascript 文件的同步加载与异步加载实现原理
Dec 13 #Javascript
javaScript复制功能调用实现方案
Dec 13 #Javascript
js遍历td tr等html元素
Dec 13 #Javascript
js关闭模态窗口刷新父页面或跳转页面
Dec 13 #Javascript
HTML复选框和单选框 checkbox和radio事件介绍
Dec 12 #Javascript
You might like
discuz7 phpMysql操作类
2009/06/21 PHP
php检测网页是否被百度收录的函数代码
2013/10/09 PHP
解决php的“It is not safe to rely on the system’s timezone settings”问题
2015/10/08 PHP
PHP计算当前坐标3公里内4个角落的最大最小经纬度实例
2016/02/26 PHP
ThinkPHP框架实现的邮箱激活功能示例
2018/06/15 PHP
Laravel使用原生sql语句并调用的方法
2019/10/09 PHP
laravel接管Dingo-api和默认的错误处理方式
2019/10/25 PHP
JavaScript获取/更改文本框的值的实例代码
2013/08/02 Javascript
javaScript中的this示例学习详解及工作原理
2014/01/13 Javascript
JavaScript基于setTimeout实现计数的方法
2015/05/08 Javascript
js实现仿爱微网两级导航菜单效果代码
2015/08/31 Javascript
jquery表格datatables实例解析 直接加载和延迟加载
2016/08/12 Javascript
Bootstrap下拉菜单Dropdowns的实现代码
2017/03/17 Javascript
JS 判断某变量是否为某数组中的一个值的3种方法(总结)
2017/07/10 Javascript
深入理解Vue Computed计算属性原理
2018/05/29 Javascript
微信小程序实现留言板
2018/10/31 Javascript
详解如何在Node.js的httpServer中接收前端发送的arraybuffer数据
2018/11/11 Javascript
jQuery实现的点击显示隐藏下拉菜单功能完整示例
2019/05/17 jQuery
electron-vue开发环境内存泄漏问题汇总
2019/10/10 Javascript
Vuex的各个模块封装的实现
2020/06/05 Javascript
[01:00:06]加油DOTA_EP01_网络版
2014/08/09 DOTA
python轻松实现代码编码格式转换
2015/03/26 Python
python实现简单http服务器功能
2018/09/17 Python
Python 忽略warning的输出方法
2018/10/18 Python
对python 自定义协议的方法详解
2019/02/13 Python
TensorFlow梯度求解tf.gradients实例
2020/02/04 Python
Python实现遗传算法(二进制编码)求函数最优值方式
2020/02/11 Python
使用 Python 读取电子表格中的数据实例详解
2020/04/17 Python
详解KMP算法以及python如何实现
2020/09/18 Python
美国伊甸园兄弟种子公司:Eden Brothers
2018/07/01 全球购物
const和static readonly区别
2013/05/20 面试题
教育专业自荐书范文
2013/12/17 职场文书
预备党员2014全国两会学习心得体会
2014/03/10 职场文书
贷款委托书
2014/08/01 职场文书
2016年机关单位节能宣传周活动总结
2016/04/05 职场文书
Python IO文件管理的具体使用
2022/03/20 Python