【问题标题】:How to randomly permute an array in JavaScript? [duplicate]如何在 JavaScript 中随机排列数组? [复制]
【发布时间】:2012-08-15 13:57:48
【问题描述】:

可能重复:
How to randomize a javascript array?

我需要从一个数组中实现一个随机二叉搜索树 (R-BST),以便排序后的数组给出 O(n lg n) 平均时间,而不是 O(n^2),这是最坏情况下的时间如果数组已经排序或反向排序。现在两个步骤是:

  1. 随机排列数组 A。
  2. 调用 BST 排序 (A) 。

如何进行第一步 JavaScript?我希望它使每个n! 排列同样可能发生。我相信在 Java 中做到这一点的方法是 Collections.shuffle 说这样的话:

Integer[] arr = new Integer[10]; 

for (int i = 0; i < arr.length; i++) { 
    arr[i] = i; 
} 

Collections.shuffle(Arrays.asList(arr)); 

for (int i = 0; i < arr.length; i++) { 
    System.out.print(arr[i] + " "); 
} 

我将如何在 Javascript 中执行此操作?我可以使用 jQuery。

【问题讨论】:

  • 也许谷歌搜索会发现this
  • 只是一件小事,将来可能会对您有所帮助:在 java 中,您可以使用 System.our.println(Arrays.toString(arr)); 打印数组

标签: javascript jquery random sorting


【解决方案1】:

只需将.sort 与随机比较器一起使用:

var comparer = function(a,b) {
    return 2 * Math.random() - 1;
}
array.sort( comparer );

编辑由于有些人对解决方案不满意,那么这里有更经典的方法:

Array.prototype.shuffle = function() {
    var result = [];
    while( this.length ) {
        var index = Math.floor( this.length * Math.random() );
        result.push( this[ index ] );
        this.splice(index, 1);
    }
    return result;
};

【讨论】:

  • 认真的吗?将O(n) 操作变成最好的O(n log n)
  • @Alnitak 所以?这是 OP 想要的,也是最简单、最快的解决方案。
  • 按不正确的比较器排序?假设比较操作是时不变的、反交换的、传递的等。
  • 不,它不是最快的。 OP 问题的重点是随机化数组以确保他不会得到退化的O(n ^ 2) 排序。
  • 顺便说一句,ECMAScript v3 规范(第 15.4.4.11 段)中写道,如果比较器不一致,sort 的行为是实现定义的。也就是说,一些 ECMAScript 实现在给定这样的函数时可能会简单地抛出错误。
【解决方案2】:

您可以使用 shuffle 函数扩展 Array 原型:

Array.prototype.shuffle = function() {
  var tmp, rand;
  for(var i =0; i < this.length; i++){
    rand = Math.floor(Math.random() * this.length);
    tmp = this[i]; 
    this[i] = this[rand]; 
    this[rand] = tmp;
  }
}

然后在任意数组上调用shuffle 进行就地排序:

var arr = [1,2,3,4];
arr.shuffle();
console.log(arr);

【讨论】:

  • 这不是一个正确的洗牌算法。每个元素都应该与它自己或数组中的某个后面的元素交换,并且不是数组的任何任意元素。见adrianquark.blogspot.co.uk/2008/09/…
猜你喜欢
  • 2021-03-03
  • 2012-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-19
  • 1970-01-01
  • 1970-01-01
  • 2011-08-08
相关资源
最近更新 更多