首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > JavaScript >

求更有效率的代码 JS 数组 随机自动排序解决办法

2012-03-29 
求更有效率的代码 JS 数组 随机自动排序网上查到一个方法(这个方法效率不高,不贴出代码了):基本思路:随机

求更有效率的代码 JS 数组 随机自动排序
网上查到一个方法(这个方法效率不高,不贴出代码了):

  基本思路:随机读取数组1中的一个数据,将其与数组2中的数据进行比较,如果存在,就另读取,直到读到新数据存到数组2中,当数组2的长度等于数组1的长度时,停止读取数据,输出数组2。
  变化:因为数据有可能有重复,所以再使用一个数据来存储数组2中的数据序号,检验数据是否读取过时,改成比较数据序号。

于是按自己想法写了,加上多次改进(勉强达要求):

JScript code
function ran_Arr_2(oArr) {    var arrNum = [];    var tArr = [];//新数组    var random_x;    for(var i=oArr.length;i>0;i--) {        random_x = Math.floor(Math.random()*i); //   取得一个随机数        arrNum.push(random_x);//压进位置        for(var j=0;j<arrNum.length-1;j++) {            if( random_x >= arrNum[j])                random_x++;        }        tArr.push(oArr[random_x]); //压进数组    }    return tArr; //返回新数组}function ran_Arr_3(oArr) {    var oArr_copy = oArr.slice(0);//复制原数组    var tArr = [];//新数组    var random_x;    for(var i=oArr.length;i>0;i--) {        random_x = Math.floor(Math.random()*i); //   取得一个随机数        tArr.push(oArr_copy[random_x]); //压进数组        oArr_copy[random_x] = oArr_copy[i-1];    }    return tArr; //返回新数组}function ran_Arr_4(oArr) {    var temp_x; //临时交换数    var tArr = oArr.slice(0);//新数组,复制原数组    var random_x;    for(var i=oArr.length;i>0;i--) {        random_x = Math.floor(Math.random()*i); //   取得一个随机数        temp_x = tArr[random_x];        tArr[random_x] = tArr[i-1];        tArr[i-1] = temp_x;    }    return tArr; //返回新数组}




现求更有效率的代码:

[解决办法]
看不明白
“ 基本思路:随机读取数组1中的一个数据,将其与数组2中的数据进行比较,如果存在,就另读取,直到读到新数据存到数组2中,当数组2的长度等于数组1的长度时,停止读取数据,输出数组2。 ”

数组1和2没有限定条件?比如长度?如果2大于永远也不会有结果................
[解决办法]
帮顶
[解决办法]
JScript code
var a = [1, 2, 3, 4, 5, 6,7];    var b = [2, 6,10];       var isok = true;      while (true) {        isok = true;        var lena = a.length;        var lenb = b.length;        if (lenb >= lena) {            break;        }        var rand = Math.round(Math.random() * (lena-1));            for (var i = 0; i < lenb; i++) {            if (b[i] == a[rand]) {                isok = false;                break;            }        }        if (isok == true) {            b.push(a[rand]);        }        }    document.getElementById("div1").innerHTML =b.valueOf();
[解决办法]
路过
[解决办法]
基本思路:随机读取数组1中的一个数据,将其与数组2中的数据进行比较,如果存在,就另读取,直到读到新数据存到数组2中,当数组2的长度等于数组1的长度时,停止读取数据,输出数组2。

给我的感觉你的意思就是比较两个数组arr1,arr2,如果arr2中没有arr1的数据,就是当前arr1的数据写入arr2中,并且arr2的长度不能大于arr1的长度,并没有存在排序的问题?!
JScript code
         var arr1 = [1,2,3,5,6,8,9];         var arr2 = [4,6];         function addSome(arr1,arr2){             if(arr1==null||arr1.length==0) return [];             if(arr2==null||arr2.length==0) return arr1;             var length = arr2.length;             var obj = new Object();             for(var i=0; i<length; i++){                 eval("obj.pop" + arr2[i] + "='" + arr2[i] + "';");             }             var l = arr1.length;             for(var i=0;i<l;i++) {                 if(eval("typeof obj.pop" + arr1[i] + "=='undefined'")){                    arr2.push(arr1[i]);                 }                 if(arr2.length==l){                     break;                 }             }             return arr2.sort(); //如果要排序的话,再加上sort         }         var t = addSome(arr1,arr2);         alert(t);
------解决方案--------------------


JScript code
<script language="javascript">Array.prototype.unique2 = function(){   for(var a={}, b={}, i=0, n=this.length; i<n; i++){     if(typeof(b[this[i]])!="undefined") continue;    if(typeof(a[this[i]])=="undefined") a[this[i]] = 1;     else{ b[this[i]]=1;    delete a[this[i]]  }  }   this.length=0;   for(i in a) this[this.length] = i;   return this; };   var a1 = new Array(1,2,3,4,5,6,7,8,9);var a2 = new Array(2,3,4,5,6,7);var c = a1.concat(a2).unique2();var d = a2.concat(c).unique2();alert(d);//你要的结果//至于d数组不能超过a1数组的长度,自己做下处理好了</script>
[解决办法]
学习
[解决办法]
现在才明白你的意思,那么大的数据量,然后随机排序。。

光for (var j=0;j<1000000;j++) { xx.push(j) }这句花费的时间就不少了 =。= 

如果这样,为什么不直接重新随机生成下数组呢?! 

[解决办法]
JScript code
var a = [1,2,3,5,6,8,9];alert(a.sort(function(){    return 0.5 > Math.random();}));
[解决办法]
我测的数据在10000000,用你的方法
ran_Arr 154.29%2675.891ms2675.891ms 2675.891ms 2675.891ms 2675.891ms

renderArr 145.7%2252.419ms2252.419ms2252.419ms2252.419ms 2252.419ms


JScript code
         function renderArr(arr){             var _arr = arr;             var temp,random;             var length = arr.length;             while(length){                 random = Math.floor(Math.random()*length);                 temp = _arr[random];                 length--;                 _arr[random] = _arr[length];_arr[length] = temp;             }             return _arr;         }
[解决办法]
探讨
引用:
为虾米要随机排序呢? - -!

哈哈
玩过斗地主,麻将什么的游戏吧,
彩票随机抽号听说过吧

一般不定的测算,都要随机测试的。这个随机数对开发新型的事物很重要

[解决办法]
LZ有必要把1000条以上的数据交给客户端来处理吗
JS的性能在高,相对服务器来讲还是很低
[解决办法]
JScript code
<script type='text/javascript'>var arr = [1,2,3,4,5,6,7,8,9];var len = arr.length;while(len--){    var k = Math.round(Math.random()*len)    arr[len] = [arr[k],arr[k]=arr[len]][0]}alert(arr);</script>
[解决办法]
mark !
[解决办法]
lihai

热点排行