2016-10-12 7 views
0

JS에 익숙하며 현재 대학에서 배우고 있습니다. 현재 진행중인 JS 프로젝트에서는 메모리 카드 게임을 만들고 있습니다. 나는 무작위로 카드를 뒤섞는 방법을 생각하기 시작했고, 나는 Fisher-Yates Shuffle 알고리즘이 수행하는 것과 비슷하다. 두번째 프로그램은 this page이다. 그러나, 나는 스플 라이스 방법 후에 정확하게 [0]이 무엇을하는지 이해하지 못합니다. 배열을 이동/압축하는 것이 무엇입니까? 그렇다면 다른 예제/문서를 찾을 수 없습니다.Fisher-Yates Shuffle in Javascript

function shuffle(array) { 
    var copy = [], n = array.length, i; 

    // While there remain elements to shuffle… 
    while (n) { 

    // Pick a remaining element… 
    i = Math.floor(Math.random() * n--); 

    // And move it to the new array. 
    copy.push(array.splice(i, 1)[0]); 
    } 

    return copy; 
} 

답변

2

array.splice(i, 1)arrayi 번째 요소 밖으로 삭감과 단일 값 배열로서 돌려줍니다 (다만 같은 array.splice(i, 2)i 번째와 i+1 번째 요소를 잘라 두 요소의 배열로 반환됩니다). 그런 다음 간단한 색인 작업 인 [0]은 해당 배열에서 단일 요소를 선택합니다 (배열이 필요하지 않음). 이 단일 요소는 copycopy.push을 사용하여 추가됩니다. 인덱싱 작업의

더 잘 알고 사용 : 알 수없는 위치에서 임의의 카드를 가지고 새로운 배열 안에 넣어하려는 셔플 동안

array = [4, 7, 2, 10]; 
array[0] 
// => 4 
array[1] 
// => 7 

array = [18]; 
array[0] 
// => 18 
+0

@Amadan! – Ludo757

+0

그래서 나는 그것에 더 많은 생각을했습니다. 필자가 얻지 못하는 것은 스플 라이스의 범위가'(i, 1)'이기 때문에'[0]'이 중복된다는 것입니다. – Ludo757

+0

'splice'는 배열을 반환합니다. 푸시는 하나의 가치를 원한다. 1 요소 배열은 요소와 같은 것이 아닙니다. 믹서기에 토마토와 함께 메쉬 백을 넣으려고하는 것과 같습니다. "글쎄, 나는이 소스를 위해 하나의 토마토가 필요하고, 가방에는 오직 토마토 하나만 남았고, 왜 그렇게하지 않았 느냐?". 그 플라스틱 메쉬 섬유가 쫄깃한면에 약간 있기 때문에 먼저 토마토를 자루에서 꺼내야합니다. – Amadan

0

array.splice()는 배열을 반환합니다,하지만 (하나를 단행). 이제 캐치는 copy.push(array.splice(i, 1)을 사용하여 유사한 배열을 다시 추가하고 싶지 않습니다. 배열 전체에 반환 된 배열을 추가하고 셔플의 무작위성이 줄어들어 게임에서 종속적 인 결과를 초래할 수 있습니다. 배열은 뒤집힌 비트 수가 거의없는 마지막 배열과 비슷합니다 (~). [0]array.splice(i, 1)에 추가하면 시간에 반환 된 전체 결과 배열에서 하나의 요소 만 복사하므로 더 큰 임의성을 얻을 수 있습니다.

+0

@ Cyclotron3x3 고맙습니다, 지금 당장 말이야. 매우 감사. – Ludo757

+0

내가 얻지 못하는 것은 random number가 'i'에 의해 만들어지며, 배열의 랜덤 인덱스를 선택하여 splice 할 것이고 결과는 새로운 배열'copy'의 끝에 푸시됩니다. , 결국 새로운 배열의 요소들의 전체 인덱싱은 무작위적일 것이다 (각 반복은 배열의 끝에서 요소를 푸시한다). 여기서'[0]'이 중복되지 않습니까? – Ludo757