欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

js 产生不重复随机数

shiping1 的头像
google "js 产生不重复随机数"
JavaScript产生不重复随机数
所属分类:JavaScript发布时间:2012-12-14 22:54:17点击量:1352
转载请自觉注明原文:http://www.lhy-seo.com/JavaScript/detail-13.html

方法一:

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

01<script type="text/javascript">
02var count=3000;
03var originalArray=new Array;//原数组
04//给原数组originalArray赋值
05for (var i=0;i<count;i++){
06originalArray[i]=i+1;
07}
08var d1=new Date().getTime();
09for (i=0;i<count;i++){
10var index=Math.floor(Math.random()*originalArray.length); //随机取一个位置
11document.write(index+" , ");
12originalArray.splice(index,1);
13}
14var d2=new Date().getTime();
15document.write("运算耗时"+(d2-d1));
16</script>

性能:耗时 1528 毫秒。


方法二:

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

01<script type="text/javascript">
02var count=3000;
03var originalArray=new Array;//原数组
04//给原数组originalArray赋值
05for (var i=0;i<count;i++){
06originalArray[i]=i+1;
07}
08var d1=new Date().getTime();
09for (var num,i=0;i<count;i++){
10do{
11num=Math.floor(Math.random()*count);
12}while(originalArray[num]==null);
13document.write(originalArray[num]+" , ");
14originalArray[num]=null;
15}
16var d2=new Date().getTime();
17document.write("运算耗时"+(d2-d1));
18</script>

性能:耗时 290 毫秒。


方法三:

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

01<script type="text/javascript">
02var count=3000;
03var originalArray=new Array;//原数组
04//给原数组originalArray赋值
05for (var i=0;i<count;i++){
06originalArray[i]=i+1;
07}
08var d1=new Date().getTime();
09originalArray.sort(function(){ return 0.5 - Math.random(); });
10for (var i=0;i<count;i++){
11document.write(originalArray[i]+" , ");
12}
13var d2=new Date().getTime();
14document.write("运算耗时"+(d2-d1));
15</script>

性能:耗时 229 毫秒。

代码解释:

var arr=[];//新建一个数组 这是大家推荐的方式。//而不推荐使用 var arr=new Array();

这句不用解释了。

for(var i=0;i<100;i++){ arr[i]=i; }//循环给数组赋值 

关键的地方来了:

1代码
2arr.sort(function(){ return 0.5 - Math.random() })
3//sort 是对数组进行排序
4//他的是这样工作的。每次从数组里面挑选两个数 进行运算。
5//如果传入的参数是0 两个数位置不变。
6//如果参数小于0 就交换位置
7//如果参数大于0就不交换位置
8//接下来用刚才的较大数字跟下一个进行比较。这样循环进行排序。
9/*恰好。我们利用了这一点使用了0.5 - Math.random 这个运算的结果要么是大于0,要么是小于0.这样要么交换位置,要么不交换位置。当然大于或者小于0是随即出现的。所以数组就被随即排序了。*/

通过性能分析,得出方法三为最佳方案。

来自 http://www.lhy-seo.com/JavaScript/detail-13.html
http://www.jb51.net/article/15747.htm
http://www.jb51.net/article/32602.htm

普通分类: