具有固定位置的随机数组作为例外

时间:2016-10-29 10:54:10

标签: javascript arrays exception shuffle

我有一个输出多个ID的数组。该订单应该被洗牌,但第一个ID应该保持在这个位置。 我看过Fisher-Yates(又名Knuth)Shuffle,但我不知道如何为我的情况编辑它。

一种方法是将其拆分为两个数组。一个与单个对象。然后用另一个帖子将数组洗牌。在洗牌之后,我像在这个小提琴中那样组合了两个数组:https://jsfiddle.net/464fmfty/2/

// array listing post ids
var arr = [2, 11, 37, 42, 88, 234, 23, 71, 172, 82];
var arrNew = [];

arrNew.push(arr.shift());
arr = shuffle(arr);
arrNew.push(arr);

document.body.innerHTML= arrNew;

但我想知道是否有更好/更美丽的方法来做到这一点?

3 个答案:

答案 0 :(得分:1)

shuffle函数应该像shuffle(arr, start, length)一样调用,然后代码变得简单。

function shuffle(array, start, length) {
  var currentIndex, i, tmp, randomIndex;

   for (i = length; i > 1; i--) {

    // Pick a remaining element...
    randomIndex = start + Math.floor(Math.random() * i);
    currentIndex = start + i - 1;

    // And swap it with the current element.
    tmp = array[currentIndex];
    array[currentIndex] = array[randomIndex];
    array[randomIndex] = tmp;
  }
}

// array listing post ids
var arr = [2, 11, 37, 42, 88, 234, 23, 71, 172, 82];

shuffle(arr, 1, arr.length - 1);

document.body.innerHTML= arr;

请注意,我删除了return arr,因为当一个函数就地修改数组并且返回它时会让人感到困惑。

答案 1 :(得分:1)

我猜你可能会这样做

Do
  l_oElementCollection = m_oWebrowser1.Document.GetElementById("listOfStuff").Children
  Windows.Forms.Application.DoEvents()
Loop Until l_oElementCollection.Count > 250

答案 2 :(得分:-1)

好吧,不要选择2个随机位置进行随机播放,而是选择大于0的2。

var arr = [2, 11, 37, 42, 88, 234, 23, 71, 172, 82]
for (var i = 0; i < 50; i++) {
    var from = Math.floor(Math.random() * (arr.length - 1)) + 1;
    var to = Math.floor(Math.random() * (arr.length - 1)) + 1;
    var temp = arr[from];
    arr[from] = arr[to];
    arr[to] = temp;
}