2016-10-29 2 views
0

여러 개의 ID를 출력하는 배열이 있습니다. 명령은 섞여 있어야하지만 첫 번째 신분증은이 위치에 있어야합니다. 나는 Fisher-Yates (일명 Knuth) Shuffle을 보았지만 나의 경우를 편집하는 방법을 모르겠습니다.고정 위치를 예외로 사용하는 셔플 배열

한 가지 방법은 두 개의 배열로 분할하는 것입니다. 하나는 단일 개체입니다. 그런 다음 배열을 다른 게시물과 섞습니다. 셔플 후 내가 그랬던 것처럼 나는이 바이올린의 두 배열을 결합 : 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; 

그러나이 작업을 수행 할 수있는 더 나은/더 아름다운 방법이 있는지 궁금 해서요?

답변

1

shuffle 기능이 shuffle(arr, start, length)처럼 호출 할 필요가있어 그 둘을 선택합니다. 함수 제자리 복귀 그 배열을 수정 때 혼란 때문에 I에서, 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

음, 대신 셔플 2 개 임의의 위치를 ​​따기의 다음 코드는 간단하게, 더 큰 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);

를 다음과 같이 당신이 할 수있는 것 같아요;