有没有一种方法可以随机地重新排列数组,以便每次出现时数组都可以不同地显示?

时间:2020-01-03 05:49:43

标签: 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);

它仅将数组随机化一次,并不断重复执行

5 个答案:

答案 0 :(得分:2)

编辑

第二个演示被修改为演示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]])中,更实际的回报将是数组,其元素与原始数组相同,但顺序随机([2, 4, 1, 3])。

以下演示:

  1. 使用最有效的方法来随机排列数组:Fisher–Yates algorithm

  2. 接受一个标准数组,并通过spread operator [...array]

  3. 对其进行克隆
  4. shuffle()函数被调用了3次,并返回一个具有随机顺序的新数组。

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

演示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());

答案 1 :(得分:1)

您只需要在推送之前取消引用arr。以下三个都可以。

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(Object.assign({},arr));
}
console.log(finalarr);

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});
}
console.log(finalarr);

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(JSON.parse(JSON.stringify(arr)));
}
console.log(finalarr);

答案 2 :(得分:1)

将数组文字附加到sort函数,然后将结果推送到最终数组。

df['Symbol_names'] = df['Symbol'].apply(lambda x: x.name) 

df = df.sort_values('Symbol_names')\
       .drop("Symbol_names", axis=1)\
       .reset_index(drop=True) # optional

答案 3 :(得分:1)

这里的问题是,您要向每个索引的相同数组添加一个reference。它们不是所有自己的数组,而是完全相同的数组。想象有两个新闻播报员,每个新闻播报员都报道同一故事。如果故事发生变化,则两个新闻广播员都会告诉您相同的更新。这就是这些数组的作用。当您说arr1 = arr2之类的内容时,您只是说arr1现在是相同故事/值的新闻播报员-因此更改与其中一个相关的值会同时更改它们,并且 shuffling 其中之一洗牌了两者。要更改此设置,您需要先克隆数组,然后再将其分配给新变量。

更改:

finalarr.push(arr);

收件人:

finalarr.push(arr.slice(0));

在数组上使用.slice(0)是一种克隆数组shallow copy的方法(这足以满足您的代码要求),因此每个数组实际上都是自己的值。在此处运行此新版本的代码:

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.slice(0));
}
console.log(finalarr);

我个人选择使用randojs.com来抓取经过改组的数组。每次您调用randoSequence时,它都会获取一个新的独立数组,因此不必担心引用有什么有趣的事情。使用randojs,您的代码将如下所示:

var finalarr = [];
for (var i = 0; i <= 5; i++) finalarr.push(randoSequence(1, 4));
console.log(finalarr);
<script src="https://randojs.com/1.0.0.js"></script>

答案 4 :(得分:0)

是的,您可以使用javascript数组随机播放功能随机随机播放数组。

就像在您的代码中一样

var arr=[1,2,3,4]
finalarr = [];
var shuffle_arr=shuffle(arr);
finalarr.push(shuffle_arr);

只需使用shuffle函数。