javascript - 有没有办法随机打乱数组,以便数组每次都可以不同地出现?

标签 javascript arrays sorting

var arr = [1, 2, 3, 4];
finalarr = [];
for (i = 0; i <= 5; i++) {
  arr.sort(function(a, b) {
    return 0.5 - Math.random();
  });
  finalarr.push(arr);
}
/*once it randomizes that first array, it keeps repeating it. i dont want 
that i want it to reshuffle the array everytime i run that loop*/
console.log(finalarr);

它仅随机化数组一次并不断重复

最佳答案

编辑

第二个演示是演示 1 修改为接受两个参数:

@Params: array [Array]...: The array to shuffle
        repeat [Number]..: The number of new randomized arrays to be returned

@Return: An array of arrays (aka "two-dimensional array") 


正如Nick Parsons所述,您使用的是对数组的引用,加上您的结果是一个完整数组,您在其中添加到一个空数组(例如 [[4, 3, 2, 1]]) return 将只是一个与原始数组具有相同元素但顺序随机的数组 ([2, 4, 1, 3])。

以下演示:

  1. 使用最有效的方式来打乱数组:Fisher–Yates algorithm .

  2. 接受标准数组并通过 spread operator 克隆它[...数组]

  3. shuffle() 函数被单独调用三次,并返回一个具有随机顺序的新数组。

注意:有一个可选的实用程序功能,可以更好地显示控制台日志。这不是一个要求。

演示 1

let array = [1, 2, 3, 'A', 'B', 'C'];

const shuffle = ([...array]) => {
  let i = 0;
  let j = 0;
  let temp = null;

  for (i = array.length - 1; i > 0; i -= 1) {
    j = Math.floor(Math.random() * (i + 1));
    temp = array[i];
    array[i] = array[j];
    array[j] = temp;
  }
  return array;
}

const log = data => console.log(JSON.stringify(data));

log(shuffle(array));
log(shuffle(array));
log(shuffle(array));


演示 2

let array = [1, 2, 3, 'A', 'B', 'C'];

const shuffle = (array, repeat = 1) => {
  let result = [];
  for (let r = repeat; r > 0; r -= 1) {
    let clone = [...array];
    for (let i = clone.length - 1; i > 0; i -= 1) {
      let s = Math.floor(Math.random() * (i + 1));
      let temp = clone[i];
      clone[i] = clone[s];
      clone[s] = temp;
    }
    result.push(clone);
  }
  return result;
}

const log = data => console.log(JSON.stringify(data));


log(shuffle(array));
log(shuffle(array, 5));
// .flat() is invoked on the return array to provide a single array
log(shuffle(array, 5).flat());

关于javascript - 有没有办法随机打乱数组,以便数组每次都可以不同地出现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59573756/

相关文章:

javascript - 如何获取视频的精确时间更新以返回最多 2 位小数(毫秒)?

javascript - 根据使用名称选择的下拉值更改图标

javascript - 使用 jQuery 从响应 header 获取图像文件大小

java - 来自 leetcode 的 Java 中的两个和

java - 手动数组排序返回 nullpointerexception

javascript 和搜索引擎优化

java - 尝试实现两个 ArrayStacks 时出错 -Java

java - 我不断收到错误 : int cannot be dereferenced. 如何修复它?

c# - 对字符串值内的数据进行排序

c# - 根据数组的第一个元素对 double[,] 列表进行排序