다음은 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) 셔플링 알고리즘입니다.
여기 에서 멋진 시각화 를 볼 수 있습니다(원본 게시물 여기에 링크됨 )