2016-10-29 6 views
0

私はいくつかのIDを出力する配列を持っています。順序はシャッフルする必要がありますが、最初のIDはこの位置にとどまります。 私はFisher-Yates(別名Knuth)Shuffleを見てきましたが、私のケースで編集する方法がわかりません。固定位置を例外としてシャッフル配列

1つの方法では2つの配列に分割することができます。 1つは単一のオブジェクトです。そして、もう一方のポストで配列をシャッフルしてください。 https://jsfiddle.net/464fmfty/2/

// array listing post ids 
var arr = [2, 11, 37, 42, 88, 234, 23, 71, 172, 82]; 
var arrNew = []; 

arrNew.push(arr.shift()); 
arr = shuffle(arr); 
arrNew.push(arr); 

document.body.innerHTML= arrNew; 

しかし、これを行うには良い/より美しく方法がある場合、私は思っていた:シャッフルした後、私はこのフィドルで行ったように私は、2つの配列を結合しますか?

答えて

1

よりも大きいですその2を選択する2つのランダムな位置を選ぶの。関数はインプレース戻り、それ配列を変更したときに、それが混乱しているので、私は、return arrを除去

 
function shuffle(array, start, length) { 
    var currentIndex, i, tmp, randomIndex; 

    for (i = length; i > 1; i--) { 

    // Pick a remaining element... 
    randomIndex = start + Math.floor(Math.random() * i); 
    currentIndex = start + i - 1; 

    // And swap it with the current element. 
    tmp = array[currentIndex]; 
    array[currentIndex] = array[randomIndex]; 
    array[randomIndex] = tmp; 
    } 
} 

// array listing post ids 
var arr = [2, 11, 37, 42, 88, 234, 23, 71, 172, 82]; 

shuffle(arr, 1, arr.length - 1); 

document.body.innerHTML= arr; 

注意。

+0

これは私が持っていたものよりも読みやすく、短くなっているため、これを答えとしてマークしました。 –

-1

まあ、代わりに、シャッフルshuffle関数は、コードが簡単になり、shuffle(arr, start, length)のように呼ばれるべき0

var arr = [2, 11, 37, 42, 88, 234, 23, 71, 172, 82] 
for (var i = 0; i < 50; i++) { 
    var from = Math.floor(Math.random() * (arr.length - 1)) + 1; 
    var to = Math.floor(Math.random() * (arr.length - 1)) + 1; 
    var temp = arr[from]; 
    arr[from] = arr[to]; 
    arr[to] = temp; 
} 
+0

このシャッフルは公平ではありません。 –

+0

@Rolandなぜ正確に? –

+0

配列が大きくなるほど、要素が元の位置にとどまる可能性が高くなります。 –

1

私は

function shuffleFromOne(arr){ 
 
    var i = arr.length, 
 
     j, 
 
    tmp; 
 
    while (i > 1) { 
 
    j = Math.floor(Math.random()*--i)+1; 
 
    tmp = arr[i]; 
 
    arr[i] = arr[j]; 
 
    arr[j] = tmp; 
 
    } 
 
    return arr; 
 
} 
 

 
var arr = [1,2,3,4,5,6,7,8,9], 
 
    brr = shuffleFromOne(arr); 
 
console.log(brr);

を次のように行う可能性があります推測します。