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 相关文章推荐
JS获取鼠标坐标的实例方法
Jul 18 Javascript
JavaScript数组常用操作技巧汇总
Nov 17 Javascript
ajax与json 获取数据并在前台使用简单实例
Jan 19 Javascript
jQuery插件FusionCharts绘制的2D帕累托图效果示例【附demo源码】
Mar 28 jQuery
node.js 中间件express-session使用详解
May 20 Javascript
vue.js 左侧二级菜单显示与隐藏切换的实例代码
May 23 Javascript
SeaJS中use函数用法实例分析
Oct 10 Javascript
微信小程序实现文字无限轮播效果
Dec 28 Javascript
C#程序员入门学习微信小程序的笔记
Mar 05 Javascript
vue实现简单加法计算器
Oct 22 Javascript
Vue——前端生成二维码的示例
Dec 19 Vue.js
解决vue项目本地启动时无法携带cookie的问题
Feb 06 Vue.js
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
用文本文件制作留言板提示(上)
2006/10/09 PHP
php 结果集的分页实现代码
2009/03/10 PHP
创建配置文件 用PHP写出自己的BLOG系统 2
2010/04/12 PHP
Laravel中七个非常有用但很少人知道的Carbon方法
2017/09/21 PHP
php实现登录页面的简单实例
2019/09/29 PHP
Laravel框架Eloquent ORM修改数据操作示例
2019/12/03 PHP
JQuery 操作Javascript对象和数组的工具函数小结
2010/01/22 Javascript
jQuery实现用方向键控制层的上下左右移动
2013/01/13 Javascript
jquery解析XML字符串和XML文件的方法说明
2014/02/21 Javascript
js读写json文件实例代码
2014/10/21 Javascript
javascript属性访问表达式用法分析
2015/04/25 Javascript
归纳下js面向对象的几种常见写法总结
2016/08/24 Javascript
nodejs中全局变量的实例解析
2017/03/07 NodeJs
canvas实现爱心和彩虹雨效果
2017/03/09 Javascript
详解通过JSON数据使用VUE.JS
2017/05/26 Javascript
Node.JS使用Sequelize操作MySQL的示例代码
2017/10/09 Javascript
浅谈Node.js 子进程与应用场景
2018/01/24 Javascript
学习jQuery中的noConflict()用法
2018/09/28 jQuery
Angular4.0动画操作实例详解
2019/05/10 Javascript
JavaScript设计模式---单例模式详解【四种基本形式】
2020/05/16 Javascript
Python Queue模块详解
2014/11/30 Python
一个基于flask的web应用诞生 用户注册功能开发(5)
2017/04/11 Python
python删除列表元素的三种方法(remove,pop,del)
2019/07/22 Python
在PyTorch中使用标签平滑正则化的问题
2020/04/03 Python
jupyter notebook 增加kernel教程
2020/04/10 Python
关于canvas绘制模糊问题的解决方法
2019/09/24 HTML / CSS
记一次高分屏下canvas模糊问题
2020/02/17 HTML / CSS
简述进程的启动、终止的方式以及如何进行进程的查看
2014/02/20 面试题
倡议书范文格式
2014/05/12 职场文书
董事长助理岗位职责
2015/02/11 职场文书
2016教师校本培训心得体会
2016/01/08 职场文书
2016年小学“公民道德宣传日”活动总结
2016/04/01 职场文书
关于Javascript闭包与应用的详解
2021/04/22 Javascript
JavaScript实现显示和隐藏图片
2021/04/29 Javascript
win10清理dns缓存
2022/04/19 数码科技
JS setTimeout与setInterval的区别
2022/04/20 Javascript