IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Cartes aléatoires avec code qui ne fonctionne qu'à moitié.


Sujet :

JavaScript

  1. #1
    Membre habitué

    Homme Profil pro
    Sans emploi
    Inscrit en
    Août 2019
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Sans emploi

    Informations forums :
    Inscription : Août 2019
    Messages : 72
    Points : 127
    Points
    127
    Par défaut Cartes aléatoires avec code qui ne fonctionne qu'à moitié.
    Bonsoir,

    J'essaie de faire un tableau avec des cartes de jeu (sources d'images) aléatoire en ayant initialisé le tableau avec chaque source et le nom de chaque carte...

    Ca marche jusque là. Mais j'aimerai faire une fonction qui rend le deck de carte aléatoire (mélangé donc) Et la ma fonction ne marche qu'a moitié car j'ai des doublons de cartes je ne vois pas la cause de ces doublons.

    Je poste le morceau de code avec la fonction.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    var player1 = new Array();
    player1[0] = ["./pics/green/araignee_fouettesoie.jpg", "arraignee fouettesoie"];
    player1[1] = ["./pics/green/araignee_sentinelle.jpg", "araignee sentinelle"];
    player1[2] = ["./pics/green/archidruide_elfe.jpg", "archidruide elfe"];
    //etc...
    //La fonction qui mélange ensuite
    function randomPlayer1(){
    	var i;
    	var randNum=0;
    	var bufSrc="";
    	var bufName="";
    	for(i=0;i<60;i++)
    	{
    		let randNum=Math.floor(Math.random() * 60);
    		bufSrc=player1[i][0];
    		bufName=player1[i][1];
    		player1[i]=player1[randNum];
    		player1[randNum][0]=bufSrc;
    		player1[randNum][1]=bufName;
    	}
    }
    Donc le soucis c'est que j'ai des cartes en doubles suite à la fonction ci-présente et je ne trouve pas l'erreur.

    Merci.

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 395
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 395
    Points : 15 756
    Points
    15 756
    Par défaut
    vous tirez plusieurs fois un nombre au hasard donc ce nombre peut tomber plusieurs fois sur la même valeur.
    pour éviter cela, vous pouvez par exemple retirer la valeur du tableau à chaque tirage.

  3. #3
    Membre habitué

    Homme Profil pro
    Sans emploi
    Inscrit en
    Août 2019
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Sans emploi

    Informations forums :
    Inscription : Août 2019
    Messages : 72
    Points : 127
    Points
    127
    Par défaut
    Bonjour, merci du conseils mais est ce vraiment la le soucis? Car le code que j'ai écris est sencé normalement remplacer /intervertir la carte...Peu importe la valeur meme si effectivement la valeur prise au hasard peut-être redondante. Cependant je vais suivre votre conseils, ca évitera peut-étre que ce phénomène se prosuises, Merci.

  4. #4
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 395
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 395
    Points : 15 756
    Points
    15 756
    Par défaut
    ah oui je n'avais pas compris la suite du code, j'ai l'impression que les 2 variables "buf" restent liées à la case "i".

    en faisant une recherche, j'ai trouvé une fonction de mélange qui utilise moins de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function randomPlayer1()
    {
    	player1.sort(() => Math.random() - 0.5);
    }

  5. #5
    Membre habitué

    Homme Profil pro
    Sans emploi
    Inscrit en
    Août 2019
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Sans emploi

    Informations forums :
    Inscription : Août 2019
    Messages : 72
    Points : 127
    Points
    127
    Par défaut
    Super ça marche correctement cette fonction Encore merci.

    J'ai quand même essayé de comprendre ce qu'il n'allait pas...J'ai pu avoir un autre code fonctionnel (où l'on voit mieux les étapes de la fonction).
    J'arrive à un résultat concluant avec ceci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function randomPlayer1(){
    	for(let i=0;i<60;i++)
    	{
    		let randNum=Math.floor(Math.random() * 60);
    		[player1[i],player1[randNum]]=
    		[player1[randNum],player1[i]];
    	}
    }

    Le code d'origine est celui ci et ce code s'adapte à la longueur du tableau.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    function shuffle(array) {
      let currentIndex = array.length,  randomIndex;
     
      // While there remain elements to shuffle.
      while (currentIndex != 0) {
     
        // Pick a remaining element.
        randomIndex = Math.floor(Math.random() * currentIndex);
        currentIndex--;
     
        // And swap it with the current element.
        [array[currentIndex], array[randomIndex]] = [
          array[randomIndex], array[currentIndex]];
      }
     
      return array;
    }

  6. #6
    Membre éclairé
    Femme Profil pro
    Autre
    Inscrit en
    Janvier 2017
    Messages
    335
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Janvier 2017
    Messages : 335
    Points : 715
    Points
    715
    Par défaut
    Bonjour Kitsune64,
    Citation Envoyé par Kitsune64 Voir le message
    Super ça marche correctement cette fonction Encore merci.
    Malheureusement, il ne faut pas utiliser la méthode basée sur sort car les combinaisons n'ont pas la même probabilité de sortie.

    Citation Envoyé par Kitsune64 Voir le message
    J'arrive à un résultat concluant avec ceci.
    Pareil avec cette méthode, on n'a pas la même probabilité pour chaque combinaison.

    Citation Envoyé par Kitsune64 Voir le message
    Le code d'origine est celui ci et ce code s'adapte à la longueur du tableau.
    C'est celle-là, la bonne méthode.
    En revanche, le while peut s'arrêter à 1 plutôt que 0.
    Il serait intéressant d'avoir un comparatif sur la performance entre l'instruction de permutation utilisée et la méthode passant par une variable temporaire.

  7. #7
    Membre habitué

    Homme Profil pro
    Sans emploi
    Inscrit en
    Août 2019
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Sans emploi

    Informations forums :
    Inscription : Août 2019
    Messages : 72
    Points : 127
    Points
    127
    Par défaut
    Loralina,

    je me demande ce que vous voulez dire par "les combinaisons n'ont pas la même probabilité de sortiee".

    Quelles combinaisons? le tirage au sort des cartes?

    Je ne vois pas bien la différence de traitement dans les deux derniers code excepté que j'utilise une boucle for au lieu d'un while, le code est pratiquement le même que le dernier code. Le seul point en moins c'est que je n'ai pas mis la possibilité d'envoyer le tableau dans la fonction pour l'instant aussi.

    Dans mon premier exemple (en début de topic) je suis passé par une variable temporaire et ça flanchait je ne sais pas pourquoi.

    Voilà si vous pouvez m'éclaircir ce que vous avez dit, merci.

  8. #8
    Membre averti Avatar de ASCIIDEFOND
    Homme Profil pro
    Autodidacte passionné
    Inscrit en
    Novembre 2002
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Autodidacte passionné

    Informations forums :
    Inscription : Novembre 2002
    Messages : 235
    Points : 441
    Points
    441
    Par défaut
    Bonjour à tous,

    Et comme ça ?

    Code JavaScript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    <script>
    let  player1 = new Array();
    player1[0] = ["./pics/green/001.jpg", "arraignee fouettesoie"];
    player1[1] = ["./pics/green/002.jpg", "araignee sentinelle"];
    player1[2] = ["./pics/green/003.jpg", "archidruide elfe"];
    player1[3] = ["./pics/green/004.jpg", "arraignee fouettesoie"];
    player1[4] = ["./pics/green/005.jpg", "araignee sentinelle"];
    player1[5] = ["./pics/green/006.jpg", "archidruide elfe"];
    player1[6] = ["./pics/green/007.jpg", "arraignee fouettesoie"];
    player1[7] = ["./pics/green/008.jpg", "araignee sentinelle"];
    player1[8] = ["./pics/green/009.jpg", "archidruide elfe"];
    player1[9] = ["./pics/green/010.jpg", "arraignee fouettesoie"];
    player1[10] = ["./pics/green/011.jpg", "araignee sentinelle"];
    player1[11] = ["./pics/green/012.jpg", "archidruide elfe"];
    player1[12] = ["./pics/green/013.jpg", "arraignee fouettesoie"];
    player1[13] = ["./pics/green/014.jpg", "araignee sentinelle"];
    player1[14] = ["./pics/green/015.jpg", "archidruide elfe"];
     
    shuffle(player1);
     
    function shuffle(array) {
            randomArray = []; 
            for (let i = 0; i < array.length; i += 1) {
                let nombre = Math.floor(Math.random() * (array.length - 1 + 1)); // génération d'un nombre aléatoire
                const verif = randomArray.findIndex((rang) => {return rang === array[nombre]});// array[nombre] n'est pas présent dans randomArray, alors verif est égale à -1
                (verif === -1) ? randomArray.push(array[nombre]): (i > 0 ? i -= 1 : i = i);// Si -1 pas de concordance alors on ajoute à randomArray sinon on décremente le compteur
            }
            console.table(randomArray)
        }
    </script>

  9. #9
    Membre habitué

    Homme Profil pro
    Sans emploi
    Inscrit en
    Août 2019
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Sans emploi

    Informations forums :
    Inscription : Août 2019
    Messages : 72
    Points : 127
    Points
    127
    Par défaut
    Ton exemple me semble bien compliqué, je vois déjà -1+1.

    Et je viens de le tester, ne fonctionne pas.

  10. #10
    Membre averti Avatar de ASCIIDEFOND
    Homme Profil pro
    Autodidacte passionné
    Inscrit en
    Novembre 2002
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Autodidacte passionné

    Informations forums :
    Inscription : Novembre 2002
    Messages : 235
    Points : 441
    Points
    441
    Par défaut
    Citation Envoyé par Kitsune64 Voir le message
    Ton exemple me semble bien compliqué, je vois déjà -1+1.

    Compliqué ?

    Code JavaScript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    // Modifiant cette ligne avec 
    let nombre = Math.floor(Math.random() * array.length);
    // sans le (...-1+1) qui perturbe, désolé. Cette ligne est identique à 
    randomIndex = Math.floor(Math.random() * currentIndex);

    Citation Envoyé par Kitsune64 Voir le message
    Et je viens de le tester, ne fonctionne pas.
    J'ai repris pour l'exemple la structure de ton array et chez moi ça fonctionne. Quel message renvoi la console ?

  11. #11
    Membre habitué

    Homme Profil pro
    Sans emploi
    Inscrit en
    Août 2019
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Sans emploi

    Informations forums :
    Inscription : Août 2019
    Messages : 72
    Points : 127
    Points
    127
    Par défaut
    Excuse moi je n'ai pas fait attention au log. Ça semble correcte du coup mais j'admets que je découvre certaines techniques avec ton code qui me paraissait flou. Ce signe "===" je viens d'apprendre ce que c'était par exemple.

  12. #12
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 098
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 098
    Points : 44 849
    Points
    44 849
    Par défaut
    Bonjour,
    Citation Envoyé par Kitsune64
    je me demande ce que vous voulez dire par "les combinaisons n'ont pas la même probabilité de sortiee".

    Quelles combinaisons? le tirage au sort des cartes?
    Discussion à lire pour avoir plus d'infos : Placements aléatoires images.

  13. #13
    Membre éclairé
    Femme Profil pro
    Autre
    Inscrit en
    Janvier 2017
    Messages
    335
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Janvier 2017
    Messages : 335
    Points : 715
    Points
    715
    Par défaut
    Citation Envoyé par Kitsune64 Voir le message
    Voilà si vous pouvez m'éclaircir ce que vous avez dit, merci.
    Oui, sans souci.

    Citation Envoyé par Kitsune64 Voir le message
    je me demande ce que vous voulez dire par "les combinaisons n'ont pas la même probabilité de sortiee".
    Chaque résultat possible doit avoir la même probabilité d'être obtenu que les autres.
    Exemple : pour [a,b,c], il y a 6 résultats possibles : [a,b,c], [a,c,b], [b,a,c], [b,c,a], [c,a,b], [c,b,a].
    Avec un bon algorithme, chaque résultat doit avoir 1 chance sur 6 de sortir.

    La méthode avec sort ne permet pas d'obtenir cette équiprobabilité. Je l'ai vérifié pas mal de fois et je suppose que cela doit pouvoir se démontrer en regardant l'algorithme de sort.

    Citation Envoyé par Kitsune64 Voir le message
    Je ne vois pas bien la différence de traitement dans les deux derniers code excepté que j'utilise une boucle for au lieu d'un while, le code est pratiquement le même que le dernier code.
    La différence est surtout là : Math.floor(Math.random() * 60) ; il ne faut pas multiplier par la longueur du tableau, sinon l'équiprobabilité ne sera pas obtenue.

    Citation Envoyé par Kitsune64 Voir le message
    je n'ai pas mis la possibilité d'envoyer le tableau dans la fonction pour l'instant aussi.
    C'est facultatif. C'est juste utile pour le "chaînage", exemple : elt=shuffle(tab).pop();.
    EDIT : ou alors tu voulais dire en passage de paramètre...

    Citation Envoyé par Kitsune64 Voir le message
    Dans mon premier exemple (en début de topic) je suis passé par une variable temporaire et ça flanchait je ne sais pas pourquoi.
    Il fallait permuter soit les deux tableaux soit leur contenu, et non faire un mix des deux.
    Suite à cette instruction : player1[i]=player1[randNum];, on a le même tableau sur les index i et randNum, et non 2 tableaux différents avec le même contenu.
    Il aurait ensuite fallu affecter à player1[randNum] directement une référence à un tableau précédemment mis en mémoire et non modifier le contenu du tableau.
    (EDIT 20h : j'ai remplacé le mot "cellule" par "tableau".)

    Pour donner la solution que je recommande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function shuffle(array) {
    	for(let i=array.length-1;i>0;i--) {
    		const j=Math.floor(Math.random()*(i+1));
    		const element=array[i];
    		array[i]=array[j];
    		array[j]=element;
    	}
    	return array;
    }

    ASCIIDEFOND, je ne recommande pas ta méthode ^^ principalement en raison du fait que le nombre de boucles est lié à la bonne volonté de Math.random.
    C'est le même principe que faire un while(Math.random<valeur)... Ce n'est pas recommandé, excepté dans la résolution de problèmes complexes (génération de solutions aléatoires avec trop de critères à gérer), mais même dans ce cas, on ajoute généralement un compteur de sécurité qui limite le nombre de tentatives.
    Disons que... allez, ta méthode peut passer, mais par principe, on l'évite. En plus, en performances, c'est souvent coûteux.

  14. #14
    Membre habitué

    Homme Profil pro
    Sans emploi
    Inscrit en
    Août 2019
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Sans emploi

    Informations forums :
    Inscription : Août 2019
    Messages : 72
    Points : 127
    Points
    127
    Par défaut
    Merci beaucoups pour les explications, ça m'éclaire bien.

  15. #15
    Membre averti Avatar de ASCIIDEFOND
    Homme Profil pro
    Autodidacte passionné
    Inscrit en
    Novembre 2002
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Autodidacte passionné

    Informations forums :
    Inscription : Novembre 2002
    Messages : 235
    Points : 441
    Points
    441
    Par défaut
    Merci Loralina pour ces explications.

  16. #16
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 640
    Points : 66 665
    Points
    66 665
    Billets dans le blog
    1
    Par défaut
    Il ya quelques années il y a eu un post assez intéressant sur le vrai random en javascript avec un expert qui s'était penché sur la question ... je vais essayer de retrouver ce post juste pour info...

    Ha voilà :
    https://www.developpez.net/forums/d9...ur-mots-passe/

    Ma mémoire est encore assez performante ... 18/06/2010, 10h55

  17. #17
    Membre éclairé
    Femme Profil pro
    Autre
    Inscrit en
    Janvier 2017
    Messages
    335
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Janvier 2017
    Messages : 335
    Points : 715
    Points
    715
    Par défaut
    Bonsoir SpaceFrog,
    Sujet connexe intéressant, merci.

    Citation Envoyé par SpaceFrog Voir le message
    vrai random
    "Vrai"... entre guillemets... Une façon de parler.

    Citation Envoyé par SpaceFrog Voir le message
    Ma mémoire est encore assez performante ... 18/06/2010, 10h55
    Pas mal !

Discussions similaires

  1. Code qui ne fonctionne qu'avec un command button
    Par Usgpa dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 09/07/2010, 15h56
  2. [XL-2003] Problème avec code qui ne fonctionne pas
    Par NEC14 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 30/04/2009, 16h41
  3. [Language] Code qui ne fonctionne pas
    Par kevinf dans le forum Langage
    Réponses: 2
    Dernier message: 21/11/2006, 21h08
  4. Code qui ne fonctionne pas
    Par maxti dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 22/10/2006, 11h45
  5. Code qui ne fonctionne pas sur Mac
    Par malbaladejo dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 14/01/2005, 11h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo