4

除了数组拼接之外,还有什么方法可以用来在两个数字之间生成一个随机数而不重复,直到生成这两个数字之间的所有数字?改组技术或除拼接之外的任何其他数组方法将非常有帮助。

4

3 回答 3

2

首先,我们使用fisherYates 实现(归功于@ChristopheD)并扩展数组原型以提供可用的随机播放功能

function arrayShuffle () {
   var i = this.length, j, temp;
   if ( i === 0 ) return false;
   while ( --i ) {
      j = Math.floor( Math.random() * ( i + 1 ) );
      temp = this[i];
      this[i] = this[j]; 
      this[j] = temp;
   }
}

Array.prototype.shuffle =arrayShuffle;

var numbers = new Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
numbers.shuffle();

现在使用该pop方法,我们从种子中获取一个数字,直到它为空

numbers.pop(); //returns a number

为了确保我们有一个填充了范围内数字的数组startend我们使用一个简单的循环来创建我们的种子。

var start = 1;
var end = 5;
var numbers = new Array();
for (var i = start; i <= end; i++) {
    numbers.push(i);
}

这是jsfiddle上的示例

更新:让fisherYates算法更有效地洗牌

于 2013-05-24T05:46:08.297 回答
0

在处理较小的数组时,我通常做的是随机排序数组:

yourArray.sort(function() { return 0.5 - Math.random() });
于 2016-11-22T09:04:15.063 回答
-1

试试这个http://jsbin.com/imukuh/1/edit

function randRange(min, max) {
  var result = [];
  for (var i=min; i<=max; i++) result.push(i);
  return result.map(function(v){ return [Math.random(), v] })
    .sort().map(function(v){ return v[1] });
}

console.log(randRange(1,5));
// [4, 3, 1, 5, 2]
// [3, 5, 2, 4, 1]
// [1, 5, 2, 3, 4]
// [3, 2, 5, 1, 4]
// ...
于 2013-05-24T05:52:52.710 回答