这个是原思路:
//返回arrSrc排序后的结果,但是排序的依据是arrSort
//两个Array的长度必须要相等
//funcSort(arrSortItemA,arrSortItemB)为可选项。
function SortArrayByAnother(arrSrc,arrSort,funcSort)
{
var len=arrSort.length;
if(arrSrc.length!=len)throw(new Error(-1,"SortArrayByAnother:length("+arrSrc.length+")!=length("+arrSort.length+")")); var arr=new Array(len);
for(var i=0;i<len;i++)
arr[i]={i:i,r:arrSort[i]};
funcSort=funcSort||function(a,b){return a>b?1:a<b?-1:0};
arr.sort(function(A,B){
return funcSort(A.r,B.r);
});
var arr2=new Array(len);
for(var i=0;i<len;i++)
arr2[i]=arrSrc[arr[i].i];
return arr2;
}
function Array.prototype.Random()
{
var len=this.length;
var arr=new Array(len);
for(var i=0;i<len;i++)
arr[i]=Math.random();
return SortArrayByAnother(this,arr);
}
function  Array.prototype.Random1()  
{  
           var  len=this.length;  
           var  arrt=new  Array(len);  
           for(var  i=0;i<len;i++)  
                       arrt[i]={i:i,r:Math.random()};  
           arrt.sort(function(a,b){return  a.r>b.r?1:a.r<b.r?-1:0});  
           var  arrr=new  Array(len);  
           for(var  i=0;i<len;i++)  
                       arrr[i]=this[arrt[i].i];  
           return  arrr;
}

解决方案 »

  1.   

    //这样:?function  Array.prototype.Random()
    {
    //取长度
    var len=this.length; //创建一个Array,其中的元素是一个Object,属性i是其初始index,属性r是一个随机数
    var arrt=new Array(len);
    for(var i=0;i<len;i++)
    arrt[i]={i:i,r:Math.random()}; //根据Object中的r进行排序,r为随机,那样i的位置会打乱.结果保存回arrt自身
    arrt.sort(function(a,b){return a.r>b.r?1:a.r<b.r?-1:0}); //创建结果
    var arrr=new  Array(len); //根据Object中的i来把this的元素复制到arrr中。
    for(var i=0;i<len;i++)
    arrr[i]=this[arrt[i].i]; //返回打乱了的结果。
    return arrr;
    }
      

  2.   

    function  Array.prototype.Random()  {this.sort(new Function("return Math.random()-.5"))}var ar=[0,1,2,3,4,5,6,7,8,9]
    ar.Random()
    alert(ar)
      

  3.   

    我的写法不是真正的随机的,主要是偷懒,其实Lostinet的写法结果合理一点。
      

  4.   

    我对这句的理解可能不够
    可以解释下么
    Array.prototype.Random
    这个是定义一个Random的函数方法出来么?
    里面的倒是消化了
    ^_^
      

  5.   

    prototype是原型方法,为已经存在的类增添新的方法
    为了又偷懒又随机,我又写了第二个方法:function  Array.prototype.Random()  {this.sort(new Function("return Math.random()-.5"))}
    function  Array.prototype.Random2()  {this.Random();this.Random()}var ar=[0,1,2,3,4,5,6,7,8,9]
    ar.Random2()
    alert(ar)这回的结果好多了,不够速度就更慢了呵呵
      

  6.   

    emu:
    我的和你的不止在随机的情况不同。连行为也有差别哦。
    对于
    arr2=arr1.Random()
    我的是不改变arr1的内部的。
    而你的会。你的方法写成我的行为,可以先复制一份。function Array.prototype.Random()
    {
    return this.concat().sort(function(){return Math.random()-.5})
    }对于这种不太完全随机的,还是有其用处的。例如只是想简单地打打乱。
    调整.5的大小,可以起不同的效果。
      

  7.   

    其实那段原思路,写成这样还好:function Array.prototype.SortBy(arrSort,funcSort)
    {
    var len=arrSort.length;
    if(this.length!=len)throw(new Error(-1,"SortArrayByAnother:length("+arrSrc.length+")!=length("+arrSort.length+")")); var arr=new Array(len);
    for(var i=0;i<len;i++)
    arr[i]={i:i,r:arrSort[i]};
    funcSort=funcSort||function(a,b){return a>b?1:a<b?-1:0};
    arr.sort(function(A,B){
    return funcSort(A.r,B.r);
    });
    var arr2=new Array(len);
    for(var i=0;i<len;i++)
    arr2[i]=this[arr[i].i];
    return arr2;
    }
    function Array.prototype.Random()
    {
    var len=this.length;
    var arr=new Array(len);
    for(var i=0;i<len;i++)
    arr[i]=Math.random();
    return this.SortBy(arr);
    }
    不过这个版本的Random性能当然会差很多(速度大约是顶楼的1/2)
      

  8.   

    这个SortBy对于ASP也是有用的。。
    经常就是取下来数据Array。
    然后需要排序。
    而排序的规则是另外一个数据Array
      

  9.   


    return this.concat().sort(function(){return Math.random()-.5}).sort(function(){return Math.random()-.5})这样慢一点但是结果合理一点。其实sort都是改变原数组的,我认为random改变原数组也挺合理的。
      

  10.   

    return a>b?1:a<b?-1:0 按秋水的写法就是:return a-b 呵呵
      

  11.   

    比较一下各种方法的性能:function Array.prototype.Random0()
    {
    this.sort(function(){return Math.random()-.5})
    }function  Array.prototype.Random1()  {
    for(var i=0;i<this.length;i++){
    var rnd=Math.floor(Math.random()*this.length)
    var swap=this[i];this[i]=this[rnd];this[rnd]=swap
    }
    }function Array.prototype.Random2()
    {
    this.sort(function(){return Math.random()-.5});this.sort(function(){return Math.random()-.5})
    }var ar=[0,1,2,3,4,5,6,7,8,9]
    var d0=new Date()
    for (var i=0;i<1000;i++) ar.Random0();
    var d1=new Date()
    for (var i=0;i<1000;i++) ar.Random1();
    var d2=new Date()
    for (var i=0;i<1000;i++) ar.Random2();
    var d3=new Date()alert((d1-d0)+"\n"+(d2-d1)+"\n"+(d3-d2))猜猜Random1是谁写的?
      

  12.   

    a-b对于字符串不合适.Random1的方法很好。应该是秋水写的吧??