2017-06-18 7 views
0
var testArray = [0, 1, 2, 3, 4, 5, 6] 

私がこの配列を持っていてシャッフルしたいのであれば、フィッシャー・イェーツ・シャッフルを使用することを知っていますが、どのように組織化された方法でそれをシャッフルするのでしょうか?JSで配列をシャッフルする方法は?

のように、どのように私はそれをシャッフルするだけでなく、02が3位になることはない、1は、配列の2番目のスポットになることはない、シャッフル後の配列の最初の場所で現れることはないことを保証します等

+0

あなたが記述しているもの以外のアレイのスライスでフィッシャーヨーテートを使用しないのはなぜですか?その後、再会する? – Catalyst

答えて

0

hereと記載されているSattoloのアルゴリズムの使用を検討してください。

フィッシャー・イェイツと本質的に同じですが、配列の要素が独自の位置にとどまることができない小さな変化が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); 
} 

これは、常にインデックスを混乱させるテストアレイを生成します。

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) 
} 
関連する問題