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 相关文章推荐
从sohu弄下来的flash中展示图片的代码
Apr 27 Javascript
用JS实现一个页面多个css样式实现
May 29 Javascript
jquery实现效果比较好的table选中行颜色
Mar 25 Javascript
JS设置cookie、读取cookie
Feb 24 Javascript
基于JS实现密码框(password)中显示文字提示功能代码
May 27 Javascript
第六篇Bootstrap表格样式介绍
Jun 21 Javascript
微信小程序 教程之WXML
Oct 18 Javascript
jQuery常见面试题之DOM操作详析
Jul 05 jQuery
Vue项目中引入外部文件的方法(css、js、less)
Jul 24 Javascript
详解如何在vue-cli中使用vuex
Aug 07 Javascript
详解微信小程序调用支付接口支付
Apr 28 Javascript
小程序实现筛子抽奖
May 26 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
Ha0k 0.3 PHP 网页木马修改版
2009/10/11 PHP
Apache 配置详解(最好的APACHE配置教程)
2010/07/04 PHP
php使用curl抓取qq空间的访客信息示例
2014/02/28 PHP
YII2框架中使用yii.js实现的post请求
2017/04/09 PHP
PHP与JavaScript针对Cookie的读写、交互操作方法详解
2017/08/07 PHP
需要做特殊处理的DOM元素属性的访问
2010/11/05 Javascript
js获取当前时间显示在页面上并每秒刷新
2014/12/24 Javascript
JS 作用域与作用域链详解
2015/04/07 Javascript
[原创]Javascript 实现广告后加载 可加载百度谷歌联盟广告
2016/05/11 Javascript
js实现短信发送倒计时功能(正则验证)
2017/02/10 Javascript
EasyUI为Numberbox添加blur事件的方法
2017/03/05 Javascript
Element-UI中Upload上传文件前端缓存处理示例
2019/02/21 Javascript
详解基于 Node.js 的轻量级云函数功能实现
2019/07/08 Javascript
layui监听下拉选框选中值变化的方法(包含监听普通下拉选框)
2019/09/24 Javascript
微信小程序入门之指南针
2020/10/22 Javascript
[03:22]DSPL第一期精彩集锦:酷炫到底!
2014/11/07 DOTA
python ip正则式
2009/05/07 Python
浅谈Python中带_的变量或函数命名
2017/12/04 Python
python实现音乐下载器
2018/04/15 Python
微信公众号token验证失败解决方案
2019/07/22 Python
python实现简易学生信息管理系统
2020/04/05 Python
python梯度下降算法的实现
2020/02/24 Python
Python中使用threading.Event协调线程的运行详解
2020/05/02 Python
利用PyTorch实现VGG16教程
2020/06/24 Python
如何解决python多种版本冲突问题
2020/10/13 Python
前端实现弹幕效果的方法总结(包含css3和canvas的实现方式)
2018/07/12 HTML / CSS
canvas中普通动效与粒子动效的实现代码示例
2019/01/03 HTML / CSS
英国豪华针织品牌John Smedley的在线销售商:The Outlet by John Smedley
2018/04/08 全球购物
Michael Kors加拿大官网:购买设计师手袋、手表、鞋子、服装等
2019/03/16 全球购物
个人简历自我评价八例
2013/10/31 职场文书
竞争上岗演讲稿
2014/01/05 职场文书
股东合作协议书范本
2014/04/14 职场文书
二年级评语大全
2014/04/23 职场文书
2015年基层党建工作总结
2015/05/14 职场文书
Win11如何设置右键单击显示所有选项?Win11右键单击显示所有选项设置教程
2022/04/08 数码科技
Go gRPC进阶教程gRPC转换HTTP
2022/06/16 Golang