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);
它仅将数组随机化一次,并不断重复执行
答案 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")
[[4, 3, 2, 1]]
)中,更实际的回报将是数组,其元素与原始数组相同,但顺序随机([2, 4, 1, 3]
)。
以下演示:
使用最有效的方法来随机排列数组:Fisher–Yates algorithm。
接受一个标准数组,并通过spread operator [...array]
shuffle()
函数被调用了3次,并返回一个具有随机顺序的新数组。
注意:有一个可选的实用程序功能,可以更好地显示控制台日志。这不是必需的。
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));
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
函数。