이것은 Fisher-Yates 알고리즘의 최적화된 버전인 Durstenfeld shuffle의 JavaScript 구현입니다.
카드 덱에서 무작위로 뽑는 것처럼 각 원본 배열 요소에 대해 무작위로 요소를 선택하고 다음 추첨에서 제외합니다.
이 영리한 제거 작업은 선택한 요소를 현재 요소와 바꾼 다음 나머지 요소에서 다음 무작위 요소를 선택하고 최적의 효율성을 위해 역방향으로 반복하여 무작위 선택이 단순화되도록 보장합니다(항상 0부터 시작할 수 있음). 마지막 요소.
알고리즘의 실행 시간은 O(n)。请注意,洗牌是原地进行的,所以如果你不想修改原始数组,请先使用.slice(0)사본을 만듭니다.
O(n)
.slice(0)
새로운 ES6에서는 동시에 두 개의 변수를 할당할 수 있습니다. 이는 한 줄의 코드로 할 수 있으므로 두 변수의 값을 교환하려는 경우 특히 편리합니다. 다음은 이 기능을 사용하는 동일한 함수의 더 짧은 형식입니다.
사실 편견이 없는 셔플링 알고리즘은 Fisher-Yates(일명 Knuth) 셔플링 알고리즘입니다.
여기에서 훌륭한 시각화를 볼 수 있습니다 (원본 게시물 링크됨 여기 )
이것은 Fisher-Yates 알고리즘의 최적화된 버전인 Durstenfeld shuffle의 JavaScript 구현입니다.
으아아아카드 덱에서 무작위로 뽑는 것처럼 각 원본 배열 요소에 대해 무작위로 요소를 선택하고 다음 추첨에서 제외합니다.
이 영리한 제거 작업은 선택한 요소를 현재 요소와 바꾼 다음 나머지 요소에서 다음 무작위 요소를 선택하고 최적의 효율성을 위해 역방향으로 반복하여 무작위 선택이 단순화되도록 보장합니다(항상 0부터 시작할 수 있음). 마지막 요소.
알고리즘의 실행 시간은
O(n)
。请注意,洗牌是原地进行的,所以如果你不想修改原始数组,请先使用.slice(0)
사본을 만듭니다.편집: ES6/ECMAScript 2015로 업데이트
새로운 ES6에서는 동시에 두 개의 변수를 할당할 수 있습니다. 이는 한 줄의 코드로 할 수 있으므로 두 변수의 값을 교환하려는 경우 특히 편리합니다. 다음은 이 기능을 사용하는 동일한 함수의 더 짧은 형식입니다.
으아아아사실 편견이 없는 셔플링 알고리즘은 Fisher-Yates(일명 Knuth) 셔플링 알고리즘입니다.
여기에서 훌륭한 시각화를 볼 수 있습니다 (원본 게시물 링크됨 여기 )