Shuffle Array 函数产生相同的结果
Shuffle Array function yields same result
这是一个肮脏的普通问题 javascript。我正在使用经典的数组随机播放功能:
function shuffle(array) {
var currentIndex = array.length, temporaryValue, randomIndex;
while (0 !== currentIndex) {
randomIndex = Math.floor(Math.random() * currentIndex);
currentIndex -= 1;
temporaryValue = array[currentIndex];
array[currentIndex] = array[randomIndex];
array[randomIndex] = temporaryValue;
}
return array;
}
然后在另一个函数中重复调用:
function generateQuartile (array) {
var shuffle1 = shuffle(array);
var shuffle2 = shuffle(array);
var shuffle3 = shuffle(array);
//all three shuffles are the same
}
问题是,所有这三个变量都产生相同的结果。数组被洗牌一次,然后不再洗牌。我似乎无法确定这是什么。我猜这是某种 scoping/hoisting 问题,但我真的想不通。感谢您的帮助!
洗牌工作正常。问题是您每次都 return 使用同一个数组。在每次调用时,您需要使用随机元素创建一个新数组。最简单的方法是在函数的开头克隆数组:
array = array.slice();
随着这一变化,shuffle1
、shuffle2
和 shuffle3
将成为三个不同的数组。另外,原数组不会被修改;这可能是好事也可能是坏事,具体取决于您的设计。
或者,您可以单独保留 shuffle
函数并克隆每个 return 值:
var shuffle1 = shuffle(array).slice();
// etc.
这是一个肮脏的普通问题 javascript。我正在使用经典的数组随机播放功能:
function shuffle(array) {
var currentIndex = array.length, temporaryValue, randomIndex;
while (0 !== currentIndex) {
randomIndex = Math.floor(Math.random() * currentIndex);
currentIndex -= 1;
temporaryValue = array[currentIndex];
array[currentIndex] = array[randomIndex];
array[randomIndex] = temporaryValue;
}
return array;
}
然后在另一个函数中重复调用:
function generateQuartile (array) {
var shuffle1 = shuffle(array);
var shuffle2 = shuffle(array);
var shuffle3 = shuffle(array);
//all three shuffles are the same
}
问题是,所有这三个变量都产生相同的结果。数组被洗牌一次,然后不再洗牌。我似乎无法确定这是什么。我猜这是某种 scoping/hoisting 问题,但我真的想不通。感谢您的帮助!
洗牌工作正常。问题是您每次都 return 使用同一个数组。在每次调用时,您需要使用随机元素创建一个新数组。最简单的方法是在函数的开头克隆数组:
array = array.slice();
随着这一变化,shuffle1
、shuffle2
和 shuffle3
将成为三个不同的数组。另外,原数组不会被修改;这可能是好事也可能是坏事,具体取决于您的设计。
或者,您可以单独保留 shuffle
函数并克隆每个 return 值:
var shuffle1 = shuffle(array).slice();
// etc.