В Safari и я думаю также IE7 и 8 Math.random () НЕ случайны? - PullRequest
0 голосов
/ 06 октября 2011

http://koreanwordgame.com/

Эта страница сначала загружает 4 слова в опции DIV через Ajax, а затем рандомизирует правильный ответ с помощью следующей функции, передавая 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 он находится в верхней позиции гораздо чаще, чем нет.

Я знаю, что можно было бы сделать функцию "более случайной", используя там временную метку или что-то в этом роде, но я изо всех сил пытаюсь заставить ее работать должным образом.

Ответы [ 3 ]

3 голосов
/ 06 октября 2011

Проблема не в Math.random().Это ваша «рандомизирующая» функция сортировки, которая только когда-либо возвращает 0 или 1, и никогда -1.Вот как правильно генерировать случайное int в интервале [-1. 1] на основе функции MDC getRandomInt :

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

(упрощено с getRandomInt(-1, 1)).


Тем не менее, как прокомментировал @ 32bitkid , вправо означает использовать перетасовку Фишера-Йейтса .

0 голосов
/ 06 октября 2011

Часть проблемы, с которой вы сталкиваетесь, заключается в том, как вы используете случайную функцию. Функция сортировки принимает другую функцию, которая используется для сравнения любых двух элементов в списке. Одно из предположений, сделанных функцией сортировки, заключается в том, что результаты сравнения между любыми двумя элементами являются стабильными и согласованными (т. Е. Если a Самое простое решение, которое я могу придумать, - сгенерировать случайное число для каждого элемента, который вы хотите отсортировать, а затем отсортировать элементы по этому случайно сгенерированному номеру. Это отличается от вашего подхода тем, что сравнение любых двух элементов в вашем списке всегда будет давать один и тот же результат во время сортировки элементов.

0 голосов
/ 06 октября 2011

return( temp%2 ); Оставляет вам только 0 или 1

Попробуйте использовать return( temp%4 ); Что бы оставить вас с 0, 1, 2, 3

Хотя я не уверен, для чего предназначен модуль.
Это даст вам случайное число от 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);            
};
...