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

 更新时间:2012年12月13日 16:32:32   作者:  
在 JavaScript 中,一般产生的随机数会重复,但是有时我们需要不重复的随机数,如何实现?本文给于解决方法,需要的朋友可以参考下
在 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 中介者模式实例

    Javascript 中介者模式实例

    在页面上,用户会有很多的操作 ,每进行一次操作我们需要去展示操作的结果,在这里我们有了一个问题,我们应如何去展示不同的结果呢?
    2009-12-12
  • 微信公众平台API错误代码41002的问题解决办法

    微信公众平台API错误代码41002的问题解决办法

    今天在研究微信公众号接口问题,下面这篇文章主要给大家介绍了关于微信公众平台API错误代码41002问题的解决办法,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-09-09
  • JavaScript实现一个前端会魔法的旋转魔方相册

    JavaScript实现一个前端会魔法的旋转魔方相册

    星光不问赶路人,时光不误有心人,牛牛最近学到了一个神奇的旋转魔方,今天就来分享给大家吧,希望大家能喜欢
    2022-06-06
  • js中遍历Map对象的方法

    js中遍历Map对象的方法

    下面小编就为大家带来一篇js中遍历Map对象的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-07-07
  • JavaScript的setter与getter方法

    JavaScript的setter与getter方法

    这篇文章主要为大家详细介绍了JavaScript的setter与getter方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • 关于JavaScript语句后面的分号问题

    关于JavaScript语句后面的分号问题

    下面通过本文给大家详细介绍javascript中的语句后面的分号问题,本文给大家介绍的非常详细,需要的朋友参考下吧
    2017-12-12
  • 前端用echarts绘制含有多个分层的波形图关键代码

    前端用echarts绘制含有多个分层的波形图关键代码

    每次实现各种图表时,总会用到echarts,不得不说确实是一个非常好用的开源库,这篇文章主要给大家介绍了关于前端用echarts绘制含有多个分层的波形图的相关资料,需要的朋友可以参考下
    2024-03-03
  • 纯原生js实现贪吃蛇游戏

    纯原生js实现贪吃蛇游戏

    这篇文章主要为大家详细介绍了纯原生js实现贪吃蛇游戏的相关代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • JavaScript数组迭代方法

    JavaScript数组迭代方法

    本文主要介绍了JavaScript数组迭代方法,具有很好的参考价值。下面跟着小编一起来看下吧
    2017-03-03
  • javascript键盘上下键的操作(选择)

    javascript键盘上下键的操作(选择)

    不错的使用键盘上下键实现选择的代码,方便用户操作
    2008-06-06

最新评论