Javascript js中的洗牌数组
我想用javascript洗牌一个数组 我首先编写了这个函数:Javascript js中的洗牌数组,javascript,arrays,shuffle,Javascript,Arrays,Shuffle,我想用javascript洗牌一个数组 我首先编写了这个函数: 函数洗牌(arr){ 对于(i=0;i
函数洗牌(arr){
对于(i=0;i
我的算法如下:
- 随机选择一个项目
- 随机选择另一项
- 将这两个项目切换到一起
函数shuffle1(arr){
对于(i=0;i
唯一发生的变化是:为索引随机创建的数字被分配给一个变量,然后该变量用于选择数组中的项
有人能帮我理解为什么第一个例子不能像第二个例子中预期的那样工作吗
提前感谢使用Fisher方法应能更有效地工作:
/**
* Shuffles array in place.
* @param {Array} a items An array containing the items.
*/
function shuffle (arr) {
var j, x, index;
for (index = arr.length - 1; index > 0; index--) {
j = Math.floor(Math.random() * (index + 1));
x = arr[index];
arr[index] = arr[j];
arr[j] = x;
}
return arr;
}
原始答案:使用Fisher方法应该更有效:
/**
* Shuffles array in place.
* @param {Array} a items An array containing the items.
*/
function shuffle (arr) {
var j, x, index;
for (index = arr.length - 1; index > 0; index--) {
j = Math.floor(Math.random() * (index + 1));
x = arr[index];
arr[index] = arr[j];
arr[j] = x;
}
return arr;
}
原始答案:它不更新的原因是您正在更新的数字没有引用回数组中的元素。让我们看看节点REPL 我们将创建一个数组,并尝试以两种方式更新它,然后查看是否在数组中看到了更新
> let a = [1,2,3]
undefined
> let f = a[0] // grab reference to 1st element
undefined
> f
1
> f = 2 // 1. try to update via our variable
2
> a[0]
1 // update has NOT worked
> a[0] = 2 // 2. try to update by array index
2
> a[0]
2 // update has worked
一旦我们将第一个函数更改为通过数组索引更新,两个函数都是相同的
当我更新f
时,我会给它分配一个新的数字对象,并断开与a[0]
的链接,该链接仍然指向旧的数字。在js中,数字是不可变的,所以即使我们想更新,也无法更新它们
相关的:
它不更新的原因是,您正在更新的数字没有返回到数组中的元素。让我们看看节点REPL 我们将创建一个数组,并尝试以两种方式更新它,然后查看是否在数组中看到了更新
> let a = [1,2,3]
undefined
> let f = a[0] // grab reference to 1st element
undefined
> f
1
> f = 2 // 1. try to update via our variable
2
> a[0]
1 // update has NOT worked
> a[0] = 2 // 2. try to update by array index
2
> a[0]
2 // update has worked
一旦我们将第一个函数更改为通过数组索引更新,两个函数都是相同的
当我更新f
时,我会给它分配一个新的数字对象,并断开与a[0]
的链接,该链接仍然指向旧的数字。在js中,数字是不可变的,所以即使我们想更新,也无法更新它们
相关的:
这是否回答了您的问题?您在
tmep0=temp1的shuffle()
中有一个输入错误代码>和javascript引用外部(全局)范围的变量checkout这是否回答了您的问题?您在tmep0=temp1的shuffle()
中有一个输入错误代码>和javascript引用外部(全局)范围签出的变量