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

Java Discussion :

Générer une chaine aléatoire


Sujet :

Java

  1. #1
    Membre régulier Avatar de java_fun
    Inscrit en
    Novembre 2004
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 117
    Points : 102
    Points
    102
    Par défaut Générer une chaine aléatoire
    Je veux générer une chaîne aléatoire de 5 car dont les caractères peuvent être des chiffres ou des Lettres en Majuscules.
    cordialement

  2. #2
    Membre habitué Avatar de manube
    Homme Profil pro
    Responsable sécurité
    Inscrit en
    Mai 2004
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Responsable sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 180
    Points : 178
    Points
    178
    Par défaut
    Sans faire dans la finesse, je peux te proposer ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public String generate(int length)
    {
    	    String chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; // Tu supprimes les lettres dont tu ne veux pas
    	    String pass = "";
    	    for(int x=0;x<length;x++)
    	    {
    	       int i = (int)Math.floor(Math.random() * 62); // Si tu supprimes des lettres tu diminues ce nb
    	       pass += chars.charAt(i);
    	    }
    	    System.out.println(pass);
    	    return pass;
    }
    +

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bon y a surement mieux mais bon :
    tu prends un tableau de char "abcd ... xyz"
    Un random number et tu accedes 5 fois ton tableau.

    Mais je suis certain qu'il existe des fonctions toutes faites

  4. #4
    Invité
    Invité(e)
    Par défaut
    On a été plus rapide et plus clair que moi
    Sorry

  5. #5
    Membre éclairé Avatar de sozie9372
    Inscrit en
    Mai 2005
    Messages
    713
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 713
    Points : 724
    Points
    724
    Par défaut
    Tiens... ici
    Pret à l'emploi...

  6. #6
    Membre chevronné
    Avatar de afrikha
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    1 600
    Détails du profil
    Informations personnelles :
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 1 600
    Points : 2 208
    Points
    2 208
    Par défaut
    il n'y a pas moyen de passer par l'unicode ??

  7. #7
    Membre régulier Avatar de java_fun
    Inscrit en
    Novembre 2004
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 117
    Points : 102
    Points
    102
    Par défaut
    merci c résolu ja imodi un peu pour répondre à mon besoin

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 19
    Points : 18
    Points
    18
    Par défaut
    Pour optimiser:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public String generate(int length) {
    	    String chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; // Tu supprimes les lettres dont tu ne veux pas
    	    String pass = "";
    	    for(int x=0;x<length;x++)   {
    	       int i = (int)Math.floor(Math.random() * chars.length() -1); // Si tu supprimes des lettres tu diminues ce nb
    	       pass += chars.charAt(i);
    	    }
    	    System.out.println(pass);
    	    return pass;
    }

  9. #9
    Membre régulier
    Inscrit en
    Juillet 2009
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 93
    Points : 90
    Points
    90
    Par défaut
    Pour optimiser et corriger un bug :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public static String generate(int length) {
            String chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; 
            StringBuffer pass = new StringBuffer();
            for(int x=0;x<length;x++)   {
               int i = (int)Math.floor(Math.random() * (chars.length() -1));
               pass.append(chars.charAt(i));
            }
            return pass.toString();
    }
    Remarque si la méthode n'est pas static, vous pouvez remplacer le StringBuffer par un StringBuilder.
    Les parenthèse sont obligatoire car si rand tire pa exemple un nombre tel 0.00001, le floor retourné sera -1... outofrangeException


    désolé de remonter ce sujet mais il sort avec la recherche google, et je cherchais s'il existait des solutions toute faite.

  10. #10
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 567
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 633
    Points
    21 633
    Par défaut
    Citation Envoyé par _xme_ Voir le message
    Remarque si la méthode n'est pas static, vous pouvez remplacer le StringBuffer par un StringBuilder.
    C'est pas une question de static ou pas. Static ou pas, ici le StringBuffer n'est pas réutilisé d'un appel à l'autre, donc il vaut mieux utiliser un StringBuilder.
    En fait, c'est assez rare qu'on puisse se permettre de partager un StringBuffer d'un appel à l'autre, donc, presque toujours, il faut faire les choses de sorte qu'il vaille mieux un StringBuilder.

    désolé de remonter ce sujet mais il sort avec la recherche google, et je cherchais s'il existait des solutions toute faite.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int nbChars = chars.length();
    ...
    Random.nextInt(nbChars);
    simplifie déjà pas mal les choses. Mais je n'ai pas connaissance d'un algo intégré à la bibliothèque de base pour faire une chaîne de caractères aléatoire.

  11. #11
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par _xme_ Voir le message
    Remarque si la méthode n'est pas static, vous pouvez remplacer le StringBuffer par un StringBuilder.
    Il est bien sûr préférable d'utiliser StringBuffer/StringBuilder à la place de l'opérateur +, mais comme indiqué par thelvin, dans ce code il n'y a aucune raison d'utiliser un StringBuffer en particulier, puisqu'on manipule une variable locale qui n'est en aucun cas partagée avec un autre thread.

    Citation Envoyé par _xme_ Voir le message
    Les parenthèse sont obligatoire car si rand tire pa exemple un nombre tel 0.00001, le floor retourné sera -1... outofrangeException
    En fait il ne faut pas du tout enlever -1 à la taille du tableau.

    Math.random() renvoi toujours un nombre inférieur à 1.0, donc Math.random() * chars.length() renvoi forcément un nombre inférieur à la taille du tableau. Si on fait le -1 le dernier caractère ne pourra jamais être tiré...

    De plus le Math.floor() est inutile puisque derrière on caste en int, ce qui aura pour conséquence de "perdre" les décimales...


    Une dernière optimisation mineure serait d'initialiser le StringBuilder avec la taille de la chaine finale, puisqu'on la connait (cela peut permettre d'éviter quelques redimensionnement automatique du buffer).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    	public static String generate(int length) {
    		String chars = "a";
    		StringBuilder pass = new StringBuilder(length);
    		for (int x = 0; x < length; x++) {
    			int i = (int) (Math.random() * chars.length());
    			pass.append(chars.charAt(i));
    		}
    		return pass.toString();
    	}

    Citation Envoyé par thelvin Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int nbChars = chars.length();
    ...
    Random.nextInt(nbChars);
    simplifie déjà pas mal les choses. Mais je n'ai pas connaissance d'un algo intégré à la bibliothèque de base pour faire une chaîne de caractères aléatoire.
    nextInt() n'est pas static, et il faut créer une instance de Ramdom pour l'utiliser. Ce n'est pas forcément plus pratique...


    a++

  12. #12
    Membre chevronné
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Points : 1 855
    Points
    1 855
    Par défaut
    un petit calcul en base 36 (MAX_RADIX) ne vous tente pas?

    quel est le plus petit nombre de 5 caractères en base 36 (soit N) quel est le plus grand (M).

    avec Random tirer au hasard nextint(M-N) rajouter N
    et transformer en base 36.

    non?

  13. #13
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 567
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 633
    Points
    21 633
    Par défaut
    Si. C'est pas mal niveau opti et niveau random.

    (Par contre, question clarté ça le fait un peu moins, mais bon...)

  14. #14
    Membre chevronné
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Points : 1 855
    Points
    1 855
    Par défaut
    par exemple?
    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
     
    public class RandomString5 {
    	static final int MIN = Integer.parseInt("11111", 36) ;
    	static final int MAX = Integer.parseInt("ZZZZZ", 36) ;
    	static final int DIFF = MAX - MIN ;
    	Random tireur = new Random() ;
     
    	public String getNextString() {
    		int val = tireur.nextInt(DIFF);
    		val+= MIN ;
    		return Integer.toString(val ,36);
    	}
     
    	public static void main(String[] args) {
    		RandomString5 rd = new RandomString5() ;
    		for(int ix = 0 ; ix <20 ; ix++){
    			System.out.println(rd.getNextString());
    		}
    	}
     
    }
    (bon les bornes ne sont pas correctes - il faut partir de "10000" - mais c'est l'idée)

  15. #15
    Membre régulier
    Inscrit en
    Juillet 2009
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 93
    Points : 90
    Points
    90
    Par défaut
    rebonjour
    hé bien je ne pensais que mon déterrage donnerai lieu à des commentaires aussi instructifs
    merci pour toutes ces remarques
    Par contre je n'ai pas compris la proposition de professeur shadoko ^^


    Proposition de code tenant compte des remarques
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        private static String chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
        private static int charLength = chars.length();
        public static String generateString(int length) {
            StringBuilder  pass = new StringBuilder (charLength);
            for (int x = 0; x < length; x++) {
                int i = (int) (Math.random() * charLength);
                pass.append(chars.charAt(i));
            }
            return pass.toString();
        }

  16. #16
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par _xme_ Voir le message
    Par contre je n'ai pas compris la proposition de professeur shadoko ^^
    Cela consiste à utiliser la base 36 pour afficher un nombre.
    En base 36 on utilise les 10 chiffres + les 26 lettres de l'alphabet pour représenter un nombre.

    C'est une solution viable mais moins pratique à mon avis...



    Citation Envoyé par _xme_ Voir le message
    Proposition de code tenant compte des remarques
    A mon avis il n'y a aucun intérêt à utiliser des attributs static (à moins de la réutiliser dans une autre méthode)... autant tout laisser dans le code de la méthode.


    a++

    [edit] (ajout d'une remarque)

  17. #17
    Membre chevronné
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Points : 1 855
    Points
    1 855
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    C'est une solution viable mais moins pratique à mon avis...
    c'est une "autre" solution (amusante ? mais moins "pratique" sur quels critères ?)

  18. #18
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par professeur shadoko Voir le message
    c'est une "autre" solution (amusante ? mais moins "pratique" sur quels critères ?)
    Ce n'est pas une critique hein (au contraire je trouve cela plutôt astucieux)


    C'est tout à fait adapté à la demande originale, mais si on veut un truc un peu plus générique cela n'est pas forcément adapté :
    • On n'a pas vraiment de contrôle sur les caractères utilisés.
      Par exemple pour un générateur de mot de passe, on pourrait vouloir supprimer les caractères I et O, visuellement trop proche de 1 et 0. On pourrait également vouloir ajouté des caractères spéciaux...
    • La taille de la chaine générée est fixé en dur dans le code. Si on veut quelque chose de plus variable c'est nettement moins pratique (il faudrait régénérer MIN et MAX à partir de chaines générées dynamiquement).
    • De plus tel quel on est limité à 6 caractère max (Integer.MAX_VALUE en base 36 => "zik0zj"). Et on ne monte qu'à 13 en utilisant des Long...
      Si on veut plus long il faut passer par des concaténations.



    Bref, cela répond exactement à la demande originale, mais ce n'est pas forcément la manière la plus souple


    a++

  19. #19
    Membre chevronné
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Points : 1 855
    Points
    1 855
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Bref, cela répond exactement à la demande originale, mais ce n'est pas forcément la manière la plus souple
    exact! (en fait j'ai immédiatement pensé à des BigInteger et à base64 mais je n'avais pas pensé à éliminer certains caractères de la plage possible des caractères)

  20. #20
    Membre régulier Avatar de Klivor
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    143
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 143
    Points : 100
    Points
    100
    Par défaut
    Je sais pertinemment que cette discussion est résolue mais je me permet de vous faire partager un code que j'ai mis en place et qui s'inspire de vos idées.
    Certes le code est en c# mais la migration en java est très simple.

    voici le code pour générer une chaîne aléatoire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    string caracteres ="²12345MWXCVBN67890°+&é'(-è_azertyuiçà)=~#{[|`\\opqsdf^@]}¤¨£%µghjklm§/.?<>AZERTwxcYUIOPQSDvbnFGHJKL";
              Random selAlea = new Random();
              string sel="";
              for (int i = 0; i < 8; i++)
              {
     
                  sel += caracteres[ selAlea.Next(0,caracteres.Length)];
     
              }
              return sel;
    cordialement,
    Klivor

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Générer une chaine aléatoire
    Par Thomus38 dans le forum C++
    Réponses: 5
    Dernier message: 21/07/2008, 23h45
  2. Générer une variable aléatoire gaussienne
    Par User dans le forum Probabilités
    Réponses: 5
    Dernier message: 29/06/2006, 23h58
  3. Générer une string aléatoire
    Par eG.dam dans le forum C++
    Réponses: 2
    Dernier message: 22/06/2006, 01h17
  4. Réponses: 14
    Dernier message: 15/05/2006, 17h34
  5. Besoin de générer une chaine aléatoire
    Par warsky dans le forum Langage
    Réponses: 7
    Dernier message: 01/12/2005, 20h34

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