2011-10-06 7 views
0

http://koreanwordgame.com/사파리와 나는 또한 IE7과 8 Math.random()이 무작위가 아닌가?

이 페이지 제 Ajax를 통해 옵션 된 DIV로로드 4 개 단어 다음 인수로 무작위되는 원소를 함유하는 DIV 통과 다음 기능 정답 랜덤 :

var random = function(r){ 
    r.children().sort(function(a,b){ 
     var temp = parseInt(Math.random()*10); 
     return(temp%2); 
    }).appendTo(r);    
}; 

random($("#option")); 

<div id="option"> 
<div class="option" id="option1" style="background-color: rgb(229, 232, 238); ">light</div> 
<div class="option" id="option4" style="background-color: rgb(183, 190, 204); ">pot</div> 
<div class="option" id="option2" style="background-color: rgb(183, 190, 204); ">garlic press</div> 
<div class="option" id="option3" style="background-color: rgb(183, 190, 204); ">habitant</div> 
</div> 

문제는 Safari에서 정답이 항상 최상위 위치에 있다는 것입니다 ...

그리고 IE 7과 8에서는 훨씬 더 자주 상위 위치에 있습니다.

거기에 타임 스탬프를 사용하면 "더 무작위로"기능을 만들 수 있지만 올바르게 작동하도록 고민 중입니다.

+1

문제는'Math.random()'이 아닙니다. 여러분의 "무작위 화"정렬 함수는'0' 또는'1' 만 반환하고 -1은 절대 반환하지 않습니다. –

+0

하지만 크롬과 파이어 폭스에서 잘 작동합니다. 어떻게 되나요? 솔직히 나는이 기능을 쓰지 않고 그냥 내 필요에 맞 춥니 다. – Tules

+1

정말 Fisher-Yates 셔플을 사용해야합니다. 그렇지 않으면 결과에 거의 항상 가중치가 적용됩니다. http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle –

답변

3

문제는 Math.random() 없습니다. 그것은 "randomizing"정렬 함수입니다. 0 또는 1을 반환하며 절대로 -1을 반환합니다. 여기에 제대로 MDC's getRandomInt function에 따라 간격 [-1. 1]에 임의의 INT를 생성하는 방법은 다음과 같습니다 (getRandomInt(-1, 1)에서 간체)

Math.floor(Math.random() * 3) - 1; 

. @32bitkid 댓글을 달았 같이 바로 방법은 use a Fischer-Yates shuffle하는 것입니다 말했다


.

+0

이것은 사파리와 IE에서 아름답게 작동한다. 대단히 감사합니다! – Tules

-1

return(temp%2); 내가 계수가 무엇인지 확실하지 않지만 0, 1, 2, 3

당신을 떠날 것이다 return(temp%4);을 사용하는 경우에만 0 또는 1

보십시오 당신을 남긴다.
이 0과 3 사이에 당신에게 임의의 숫자를 얻을 것이다 :

Math.floor(Math.random()*4)

그래서 당신이 할 필요가있다 :

var random = function(r){ 
    r.children().sort(function(a,b){ 
     return Math.floor(Math.random()*4); 
    }).appendTo(r);    
}; 
+0

그것은'sort' 함수가 필요로하는 것이 아닙니다. –

+0

좋아,이 기능으로 전환하면 IE에서 훨씬 좋은 결과를 얻었지만 사파리는 매회 항상 최상위에 있습니다. – Tules

+0

그리고 btw, 누가 당신을 싫어했는지 나도 아니야! – Tules

0

문제의 일부는 임의의 기능을 사용하는 방법입니다. sort 함수는 목록의 두 요소를 비교하는 데 사용되는 다른 함수를 사용합니다. 정렬 함수에 의해 가정 된 것 중 하나는 두 요소 사이의 비교 결과가 안정적이고 일관성이 있다는 것입니다 (예 : < b 및 b < c이면 < c). 인수. 따라서,이 경우 sort 함수가 무엇을 할 것인지는 실제로 보장 할 수 없습니다. 정렬 함수가 구현 된 방법에 따라 (어떤 알고리즘이 자바 스크립트에서 사용되는지 알 수 없다), 각 항목이 주어진 위치에 나타날 가능성이있는 진정한 임의 순서를 얻지 못할 가능성이 높습니다.

제가 생각할 수있는 가장 간단한 해결책은 정렬하려는 각 항목에 대해 임의의 숫자를 생성 한 다음 해당 임의로 생성 된 숫자로 항목을 정렬하는 것입니다. 이는 항목이 정렬되는 동안 목록의 두 요소를 비교하면 항상 동일한 결과를 산출한다는 점에서 접근 방식과 다릅니다.

관련 문제