http://koreanwordgame.com/

Cette page charge d'abord 4 mots dans les DIVs d'options via Ajax, puis randomise la bonne réponse avec la fonction suivante, en passant le DIV contenant les éléments à randomiser comme argument:

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>

Le problème est que dans Safari, la bonne réponse est toujours en première position ...

Et dans IE 7 et 8, il est beaucoup plus souvent en première position.

Je sais qu'il serait possible de rendre la fonction "plus aléatoire" en utilisant un horodatage là-dedans ou quelque chose, mais j'ai du mal à le faire fonctionner correctement.

0
Tules 6 oct. 2011 à 18:12

3 réponses

Meilleure réponse

Le problème n'est pas Math.random(). Il s'agit de votre fonction de tri "randomisant", qui ne renvoie que 0 ou 1, et jamais -1. Voici comment générer correctement un entier aléatoire dans l'intervalle [-1. 1], basé sur fonction getRandomInt de MDC:

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

(simplifié de getRandomInt(-1, 1)).


Cela dit, comme @ 32bitkid l'a commenté, la bonne façon est de utilisez un shuffle Fischer-Yates.

3
Community 23 mai 2017 à 12:27

return( temp%2 ); Ne vous laisse qu'avec 0 ou 1

Essayez d'utiliser return( temp%4 ); qui vous laisserait avec 0, 1, 2, 3

Bien que je ne sache pas à quoi sert le module.
Cela vous donnera un nombre aléatoire entre 0 et 3:

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

Il vous suffit donc de:

var random = function(r){
    r.children().sort(function(a,b){
        return Math.floor(Math.random()*4);
    }).appendTo(r);            
};
-1
Naftali aka Neal 6 oct. 2011 à 14:15

Une partie du problème que vous rencontrez est la façon dont vous utilisez la fonction aléatoire. La fonction de tri prend une autre fonction utilisée pour comparer deux éléments de la liste. L'une des hypothèses formulées par la fonction de tri est que les résultats de la comparaison entre deux éléments quelconques sont à la fois stables et cohérents (c'est-à-dire si a

La solution la plus simple à laquelle je peux penser est de générer un nombre aléatoire pour chaque élément que vous souhaitez trier, puis de trier les éléments par ce nombre généré de manière aléatoire. Ceci est différent de votre approche dans la mesure où la comparaison de deux éléments de votre liste produira toujours le même résultat pendant le tri des éléments.

0
Nimrand 6 oct. 2011 à 14:25