网上查到一个方法(这个方法效率不高,不贴出代码了):     基本思路:随机读取数组1中的一个数据,将其与数组2中的数据进行比较,如果存在,就另读取,直到读到新数据存到数组2中,当数组2的长度等于数组1的长度时,停止读取数据,输出数组2。
     变化:因为数据有可能有重复,所以再使用一个数据来存储数组2中的数据序号,检验数据是否读取过时,改成比较数据序号。于是按自己想法写了,加上多次改进(勉强达要求):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.   


    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();不知道是不是你要的。
      

  2.   

    基本思路:随机读取数组1中的一个数据,将其与数组2中的数据进行比较,如果存在,就另读取,直到读到新数据存到数组2中,当数组2的长度等于数组1的长度时,停止读取数据,输出数组2。 给我的感觉你的意思就是比较两个数组arr1,arr2,如果arr2中没有arr1的数据,就是当前arr1的数据写入arr2中,并且arr2的长度不能大于arr1的长度,并没有存在排序的问题?!         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);
      

  3.   


    <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>
      

  4.   

    prototype 是JS插件吗?这个是不允许的。    我只要一个函数, 不要插件。
      

  5.   

    最好能补充我这个函数 ,分不够可以再加。
    function ran_Arr_3(oArr) {
        var tArr = [];//新数组
    //..................
    //..................
    //..................    return tArr; //返回新数组
    }
      

  6.   

    什么插件?你把我的代码随便拷贝到一个notepad里保存为test.htm测试一下,是否需要插件?!
      

  7.   

    现在给出全部代码,供大家参考。望早日得到答案。
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
       <title>JS 数组 随机自动排序</title>
       <script type="text/javascript">
       <!--
       var oArrays = [];
       
        for (var j=0;j<1000000;j++) {
    oArrays.push( j + "");
        } //var oArrays = ["1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31","32","33","34","35","36","37","38","39","40","41","42","43","44","45","46","47","48","49","50","51","52","53","54","55","56","57","58","59","60","61","62","63","64","65","66","67","68","69","70","71","72","73","74","75","76","77","78","79","80","81","82","83","84","85","86","87","88","89","90","91","92","93","94","95","96","97","98","99","100"]; //   
    function ran_Arr(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; //返回新数组
    }
       
    function show_Arr()
    {
    var d1s= (new Date()).getTime();
    var oArr = ran_Arr(oArrays);
    var d2s= (new Date()).getTime();
    document.getElementById("showTime").innerHTML = d2s-d1s;


    var ss="";
        for (var j=0;j<oArr.length;j++) {
    ss += j + ". " +  oArrays[j] + " - " + oArr[j] + "<br/>";
        }
    //document.getElementById("showResult").innerHTML = ss;
         
         
    }
         window.onload = function() {
            show_Arr();
    document.getElementById("showNew").onclick = function() {show_Arr();};
         }
       //-->
       </script>
       <style type="text/css">
       <!--
         body {margin:0; padding:0;}
         p {text-align:center; background:#EEE; padding:20px 0; margin: 0;}
         span {width: 780px; word-break:break-all}
         input {width:100px; height:30px}
       -->
       </style>
      </head>
     
      <body>
         <p>
     
             <span id="showTime"> </span><br />
             <input id="showNew" name="showNew" type="button" value="生成新顺序" />
                     <br /><br />
             <span id="showResult"> </span>
             
         </p>
      </body>
     </html>
      

  8.   

    现在才明白你的意思,那么大的数据量,然后随机排序。。光for (var j=0;j<1000000;j++) { xx.push(j) }这句花费的时间就不少了 =。= 如果这样,为什么不直接重新随机生成下数组呢?! 
      

  9.   

    var a = [1,2,3,5,6,8,9];
    alert(a.sort(function(){
    return 0.5 > Math.random();
    }));
    最简单的随机排序了
      

  10.   

    这个高手的方法的确很简单,  不过用100000条数据测试了一下,比我现有的效率还是差一点。function ran_Arr(oArr) {
    var tArr = oArr.slice(0);//新数组,复制原数组
    var random_x;
    tArr.sort(function(){ return 0.5 > Math.random(); });
    return tArr; //返回新数组
    }
      

  11.   

    现有的:
    function ran_Arr(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; //返回新数组
    }
      

  12.   

    我测的数据在10000000,用你的方法
    ran_Arr   1 54.29% 2675.891ms 2675.891ms   2675.891ms 2675.891ms   2675.891msrenderArr  1 45.7% 2252.419ms 2252.419ms 2252.419ms 2252.419ms  2252.419ms         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;
             }
      

  13.   


    你的代码结构和我的完全一样啊,效率也一样,
    你的函数的快那么一点的原因我也找到了
              var tArr = oArr.slice(0);//新数组,复制原数组
    你没有复制原数组,所以快那么一点。
              var _arr = arr;
      

  14.   

    LZ有必要把1000条以上的数据交给客户端来处理吗
    JS的性能在高,相对服务器来讲还是很低
      

  15.   

    <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>
      

  16.   

    最后发现,准备结帖
    function ran_Arr(oArr) {
    var temp_x; //临时交换数
    var tArr = oArr.slice(0);//新数组,复制原数组
    for(var i = tArr.length++,random_x;i>1;i--) {
    random_x = Math.floor(Math.random()*i); //   取得一个随机数
    tArr[i] = tArr[random_x];
    tArr[random_x] = tArr[i-1];
    }
    return tArr.splice(1,1); //返回新数组
    }
      

  17.   

    偶然看到给你最精简的把 array.sort(function(){return (Math.random()<0.5?1:-1)})