Partage
  • Partager sur Facebook
  • Partager sur Twitter

Remplacer une lettre aleatoire par une autre

Sujet résolu
    18 septembre 2016 à 16:14:36

    Bonjour tout le monde,

    J'écris un programme de master mind et pour cela il me faut une fonction qui génère aléatoirement des voyelles(car l'exercice demande d'utiliser des voyelles a la place des pions de couleur) . A l'intérieur de cette fonction j'ai plusieurs boucles et la boucle dans laquelle sa coince c'est celle dans laquelle j'affecte une nouvelle valeur à une entrée qui existe déjà dans le tableau. Le soucis est que cette valeur aléatoire n'est jamais affectée à l'entrée d'index i qui existe déjà. J'ai essayé avec un replace et un toCharArray les deux me donnant le même résultat. Il peut s'agir d'une erreur d'inattention ou que j'utilise la mauvaise fonction pour effectuer ce genre d'opérations. J'ai essayé d'afficher l'index avant et après le problème et celui ci ne change pas.

    Voici le point du code ou le problème survient dans la troisième boucle for:

    sOut.toCharArray()[i]=cTab[(int)(Math.random()*cTab.length)];

    et voici le code de toute la fonction:

    public static String motAleatoire(char[] cTab)
    	{
    		int j = 0;
    		String sOut = "";
    		boolean bSameValues=true;
    		for(int i = 0;i<4;i++)
    		{
    			sOut+=cTab[(int)(Math.random()*cTab.length)];
    		}
    		while(bSameValues)
    		{
    			bSameValues=false;
    			for(int i=0;i<sOut.length();i++)
    			{
    				for(j = 0;j<sOut.length();j++)
    				{
    					if(i!=j)
    					{
    						if(sOut.charAt(i)==sOut.charAt(j))
    						{
    							System.out.println(sOut);
    							sOut.toCharArray()[i]=cTab[(int)(Math.random()*cTab.length)];
    							sOut.toString();
    							bSameValues=true;
    						}
    					}
    				}
    			}
    		}
    		return sOut;
    	}

    cTab contient les voyelles qui existent en majuscule.

    Merci d'avance pour vos réponses.




    -
    Edité par lithiumrock 18 septembre 2016 à 16:16:43

    • Partager sur Facebook
    • Partager sur Twitter
      18 septembre 2016 à 17:04:45

      Bonjour,

      Les String sont des objets immuables, c à d non-modifiables. Quand tu fais sOut.toCharArray(), ça retourne un tableau de char. Donc ligne 22, tu modifies une case d'un tableau qui n'est stocké dans aucune variable. Et bien sûr, ça n'a aucun effet sur sOut.

      Une remarque sur ta méthode. Ton algorithme va passer pas mal de temps à éliminer les combinaisons avec doublon. Une méthode plus propre et efficace serait de mettre les symboles (ici, les voyelles) dans une liste, de la mélanger avec Collections.shuffle et de prendre les 4 premières de la liste.

      • Partager sur Facebook
      • Partager sur Twitter
        18 septembre 2016 à 17:33:09

        Merci beaucoup encore une fois brubru777 C'est vrai je pourrais les mélanger mais en fait le soucis qui se poserait ce serait que cela ne réponde pas aux exigences de l'exercice qui demande un algorithme de tri aléatoire...

        Et du coup quelle serait la façon de modifier directement une string ou de créer une string contenant la bonne valeur?

        Je te remercie d'avance pour ta réponse.

        -
        Edité par lithiumrock 18 septembre 2016 à 17:44:30

        • Partager sur Facebook
        • Partager sur Twitter
          18 septembre 2016 à 18:54:09

          Modifier une String est impossible. Comme tu connais la taille de ta combinaison, le plus simple est d'utiliser un tableau de char que tu transformes en String à la fin.

          C'est quoi que tu appelles un "tri aléatoire" ?

          • Partager sur Facebook
          • Partager sur Twitter
            18 septembre 2016 à 20:23:18

            Merci beaucoup je vais chercher dans cette direction.

            Algorithme de tri aléatoire : un algorithme de tri j'ai pas fait attention et j'ai rajouté aléatoire :).

            Voila ce que j'ai fait :

            public static String motAleatoire(char[] cTab)
            	{
            		int j = 0;
            		char sOut[];
            		boolean bSameValues=true;
            		sOut=new char[4];
            		for(int i = 0;i<4;i++)
            		{
            			sOut[i]=cTab[(int)(Math.random()*cTab.length)];
            		}
            		while(bSameValues)
            		{
            			bSameValues=false;
            			for(int i=0;i<sOut.length;i++)
            			{
            				for(j = 0;j<sOut.length;j++)
            				{
            					if(i!=j)
            					{
            						if(sOut[i]==sOut[j])
            						{
            							sOut[i]=cTab[(int)(Math.random()*cTab.length)];
            						}
            					}
            				}
            			}
            		}
            		String sOutFin=new String(sOut); 
            		return sOutFin;
            	}

            et j'ai obtenu le résultat voulu. Encore une fois merci brubru777 !

            -
            Edité par lithiumrock 18 septembre 2016 à 20:45:34

            • Partager sur Facebook
            • Partager sur Twitter

            Remplacer une lettre aleatoire par une autre

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown