var testArray = [0, 1, 2, 3, 4, 5, 6]
如果我有这个阵列并希望将其改组,我知道要使用Fisher-Yates Shuffle,但我怎么能以更有条理的方式将其洗牌?
比如,我将如何改变它,但也保证0
在洗牌之后永远不会出现在数组的第一个位置,1
永远不会出现在数组的第二个位置2
{1}}永远不会出现在第三位,等等。
答案 0 :(得分:0)
考虑使用Sattolo的算法,描述为here。
它与Fisher-Yates基本相同,但只有一个小的变化导致阵列的元素无法保持在自己的位置,这似乎就是你所描述的。
答案 1 :(得分:0)
var finalArray = [];
function getUniqueNumber() {
var uniqueNumber = Math.floor(Math.random() * 6) + 0;
var doesExist = finalArray.indexOf(uniqueNumber) === -1;
if (!doesExist) {
return getUniqueNumber();
} else {
return uniqueNumber;
}
}
function generateTestArray() {
for (var i = 0; i < 6; i++) {
finalArray.push(getUniqueNumber());
}
console.log(finalArray);
}
这将始终生成一个唯一混乱索引的测试数组。
答案 2 :(得分:0)
/** fisher yates as seen on wikipedia
* for i from n−1 downto 1 do
* j ← random integer such that 0 ≤ j ≤ i
* exchange a[j] and a[i]
*/
/** modified fisher yates as described
* for i from n−1 downto 1 do
* j ← random integer such that 0 ≤ j ≤ i, j != i, a[j] != i, a[i] != j
* exchange a[j] and a[i] (where a[j] != i)
*/
let modifiedFYShuffle = (array) => {
let swap = (i, j) => {
let tmp = array[i];
array[i] = array[j];
array[j] = tmp;
}
for (let i = array.length - 1; i >= 0; --i) {
let j = i;
while (j === i || array[j] === i || array[i] === j) {
j = Math.floor(Math.random() * array.length);
}
swap(i, j)
}
}
let makeArray = () => {
let array = [];
for (let i = 0; i < 10; ++i) {
array[i] = i;
}
return array;
}
for (let i = 0; i < 10; ++i) {
let array = makeArray();
modifiedFYShuffle(array);
console.log(array)
}