【问题标题】:Shuffle Array with a fixed position as exception具有固定位置的随机数组作为例外
【发布时间】:2016-10-29 10:54:09
【问题描述】:

我有一个输出多个 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;

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

【问题讨论】:

    标签: javascript arrays exception shuffle


    【解决方案1】:

    shuffle 函数应该像shuffle(arr, start, length) 那样调用,那么代码就变得简单了。

    功能洗牌(数组,开始,长度){ var currentIndex, i, tmp, randomIndex; 对于 (i = 长度; i > 1; i--) { // 选择一个剩余的元素... randomIndex = start + Math.floor(Math.random() * i); currentIndex = 开始 + i - 1; // 并将其与当前元素交换。 tmp = 数组 [currentIndex]; 数组[当前索引] = 数组[随机索引]; 数组[随机索引] = tmp; } } // 列出帖子 id 的数组 var arr = [2, 11, 37, 42, 88, 234, 23, 71, 172, 82]; 洗牌(arr,1,arr.length - 1); document.body.innerHTML=arr;

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

    【讨论】:

    • 我将其标记为答案,因为它比我拥有的更具可读性和更短。
    【解决方案2】:

    我猜你可能会这样做

    function shuffleFromOne(arr){
      var i = arr.length,
          j,
        tmp;
      while (i > 1) {
        j = Math.floor(Math.random()*--i)+1;
        tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
      }
      return arr;
    }
    
    var arr = [1,2,3,4,5,6,7,8,9],
        brr = shuffleFromOne(arr);
    console.log(brr);

    ;

    【讨论】:

      【解决方案3】:

      好吧,与其随机选择 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;
      }
      

      【讨论】:

      • 这个洗牌不公平。
      • @Roland 为什么?
      • 数组越大,元素停留在其原始位置的可能性就越大。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-03
      • 2015-07-06
      • 2012-11-29
      • 2018-10-09
      • 1970-01-01
      • 2013-11-05
      相关资源
      最近更新 更多