2013-09-22 3 views
1

현재 가능한 모든 순열이 인 인 입력 된 문자열을 스크램블하는 간단한 기능을 수행 중입니다. 내 코드는 아래와 같습니다.Javascript 문자열의 문자를 스크램블하는 것은 모든 가능한 순열입니까?

function scramble(s) { 
    result = s.split(""); 
    for(var i = 0; i < s.length; i++) { 
     var j = Math.floor(Math.random() * (i + 1)); 
     var scrambler = result[i]; 
     result[i] = result[j]; 
     result[j] = scrambler; 
    } 
    return result.join(""); 
} 

지금까지 코드는 정상적으로 작동하는 것처럼 보였습니다.하지만 모든 가능한 순열이 똑같이 나타날 것입니까? (나는 Math.random과 Math.floor를 믿지만 실행 시간 동안 i와 j를 볼 때 별난 결과물을 얻는다.)

+0

당신이 당신의 어법의 정확성을 증명하길 원하십니까? [피셔 - 예이츠] (http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle)와 같이 잘 알려져 있거나 연구 된 것을 사용하지 않으시겠습니까? – Rup

+0

잠시 확인하십시오 - 첫 번째 캐릭터가 첫 번째 반복에서 어디로 갈 수 있습니까? – Leeor

+1

http://www.robweir.com/blog/2010/02/microsoft-random-browser-ballot.html을 참조하십시오. –

답변

4

내가 끔찍한 실수를하지 않는 한, 나는이 코드가 균일하게 분산 된 순열을 만들지 않을 것이라고 생각한다.

예를 들어 확인하십시오. 첫 번째 문자가 제자리에 머무를 확률 - i가 0 일 때, 누군가와 대체 할 수 없습니다. i가 1 일 때, 요소 0과 1은 50 %의 스와핑 가능성을 갖습니다. 따라서 결과 [0]은 확률로 그 자리에 남을 것입니다. 1/2 * 2/3 * 3/4 ... n-1/n = 1/n

그러나 마지막 요소의 확률은 한 번만 바꾸면되므로 (n-1)/n입니다. 당신은 전체 배열 중에서 선택합니다.

(i+1)s.length으로 바꾸면 더 좋은 배포판을 얻을 수 있지만 최선의 방법은 제대로 작동하는 것으로 간주하는 것이 가장 좋습니다. 여기에서 시작할 수 있습니다 - http://en.wikipedia.org/wiki/Random_permutation

관련 문제