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 :

Retourner un nombre alétoirement qui est trouvé dans une partie d'une liste


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2015
    Messages : 5
    Par défaut Retourner un nombre alétoirement qui est trouvé dans une partie d'une liste
    Salut,
    J'ai besoin de vous
    J'ai une grande Liste "ListeG" (ArrayList) qui contient plusieurs listes "ListeP" cad liste de listes. La taille de ListP diffère de chaque liste.
    Je veux sélectionner aléatoirement un nombre à partir de deuxième position jusqu'à la fin de chaque liste ListP.
    J'ai fait int nb= (int) (Math.random()*(ListeG.get(i).size()-2) mais elle ne marche pas correctement

    Est ce que vous pouvez m'aider?

    Merci d'avance.

  2. #2
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Par défaut
    Bonjour,

    Soit listeG est une liste d'entier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Random r = new Random();
    int idx = 1 + r.nextInt(listeG.size() - 1);
    int nb= listeG.get(idx);
    Adapte le à ton besoin. Tu dois tester aussi la taille de ta liste.

    A+.

  3. #3
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2015
    Messages : 5
    Par défaut
    Bonjour,
    Merci pour la réponse mais elle marche pas. Je l'ai résolu de cette manière :
    int pos = r.nextInt(((ListG.get(j).size()-1)-2)+1)+2; gene=ListG.get(j).get(pos);

    C'est la formule générale de nexInt (r.nextInt((max-min)+1)+min.

    J'ai un autre souci maintenant . Je veux choisir aléatoirement un nombre de la liste "ListK" et l'ajouter dans chaque ListP mais sans répétition. Il est different dans chaque liste.

    Merci d'avance

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Saly bélla Voir le message
    C'est la formule générale de nexInt (r.nextInt((max-min)+1)+min.
    A noter qu'on peut faire aussi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ThreadLocalRandom random = ThreadLocalRandom.current();
    int i = random.nextInt(0, ListG.size());
    int j = random.nextInt(2, ListG.get(i).size());
    gene = ListG.get(i).get(j);
    pour éviter ces formules.

    (A noter également que la deuxième position, dans une List en Java, c'est 1, pas 2).

    Citation Envoyé par Saly bélla Voir le message
    J'ai un autre souci maintenant . Je veux choisir aléatoirement un nombre de la liste "ListK" et l'ajouter dans chaque ListP mais sans répétition. Il est different dans chaque liste.
    Un nombre de la liste ListK ? Un nombre aléatoire donc je suppose ? Donc int nListK = ListK.get(random.nextInt(0,ListK.size()), un truc comme ça. A noter que comme ça fait déjà trois fois qu'on prend un nombre aléatoirement dans une List, une (des) petite(s) méthode(s) ne ferait(feraient) pas de mal, genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public int nombreAleatoire(List<Integer> list) {
        return list.get(ThreadLocalRandom.current().nextInt(0,list.size()));
    }
    public int nombreAleatoir(List<Integer> list, int debut, int fin) {
        return nombreAleatoire(list.sublist(debut,fin));
    }
    public int nombreAleatoir(List<Integer> list, int debut) {
        return nombreAleatoire(list, debut, list.size());
    }
    l'ajouter dans chaque ListP, on peut faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ListG.forEach(list->list.add(nListK));
    Ou un forEach.

    Mais sans répétition, ça veut dire quoi exactement ? Sans doublon, peut-être, c'est-à-dire que si le nombre est déjà dans une "ListP", on l'ajoute pas : si oui, il suffit de tester s'il ne s'y trouve pas déjà, avec contains(), par exemple : :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ListG.stream().filter(list->!list.contains(nListK)).forEach(list->list.add(nListK));
    Ou un forEach + un if.

    Il est différent dans chaque liste ? Dans ce cas, au lieu d'en tirer un et de boucler, pour l'ajouter à chaque ListP, boucler, et pour chaque ListP, en tirer un, faire le test, et l'ajouter. S'il faut en ajouter un qui n'est pas déjà présent, tirer un nombre tant qu'il s'y trouve (do/while). Une autre solution serait de copier la liste, de la mélanger (avec Collections.shuffle()), puis d'itérer (Iterator) sur les éléments jusqu'à ce qu'on en trouve un qui n'est pas déjà dans la liste de destination.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2015
    Messages : 5
    Par défaut
    Merci beaucoup pour les réponses

    Mais juste pour mon souci. Je vous explique d'une autre manière.
    j'ai une liste "ListK" de type Integer et plusieurs "ListeP" de type Integer. Donc je veux choisir un element E1 de ListK aléatoirement et l'ajouter par exemple dans la première ListP_1 et refaire la meme chose et ajouter E2 (mais il faut que E2 soit différent de E1) dans ListP_2 et ainsi de suit.

    J'ai proposé ce code mais le résultat n'est pas correct

    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
     
    for(int i=0; i<TailleUSV; i++){
           ArrayList<Integer> ListP = new ArrayList<>();
            ListP.add(listUSV[i]);
           ListP.add(Region.depart[i]);  
              indice= (int) (Math.random()*ListK.size());
             PosE =ListK.get(indice);
             ListP.add(PosE);
             for(int j=0; j<ListP.size(); j++){
             if(PosE == ListP.get(2)){
                 ListP.remove(2);
     
             indice= (int) (Math.random()*ListK.size());
             PosE =ListK.get(indice);
              ListP.add(PosE);
             }
             }

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Saly bélla Voir le message
    (mais il faut que E2 soit différent de E1) dans ListP_2 et ainsi de suit.
    Le plus simple pour faire ce genre de chose est de mélanger ListK (voir java.util.Collections.shuffle(List)) et de distribuer en bouclant. Sinon, il faut faire une boucle qui tire une valeur aléatoire tant qu'elle n'a pas déjà été tirée, donc stocker les valeurs tirées (dans un Set).
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  7. #7
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Par défaut
    Bonjour,

    Citation Envoyé par Saly bélla Voir le message
    int pos = r.nextInt(((ListG.get(j).size()-1)-2)+1)+2;
    1- Ce n'est pas correcte par rapport à ton énoncé:
    • Ton random commencera par le 3ème élément (r.nextInt(((ListG.get(j).size()-1)-2)+1)+2; // l'indice commence par 0 mais pas 1)
    • Ton random ne retournera pas le dernier élément. (r.nextInt(((ListG.get(j).size()-1)-2)+1)+2; // -1-2+1 = -2)

    Le code que j'ai donné est simplement à titre indicatif, c'est le même algo que tu as utilisé sauf que tu voulais récupérer une valeur depuis une liste dans la liste ListeG (avec les fautes que j'ai cité).
    2-
    Citation Envoyé par Saly bélla
    j'ai une liste "ListK" de type Integer et plusieurs "ListeP" de type Integer. Donc je veux choisir un element E1 de ListK aléatoirement et l'ajouter par exemple dans la première ListP_1 et refaire la meme chose et ajouter E2 (mais il faut que E2 soit différent de E1) dans ListP_2 et ainsi de suit.
    Tu peux nous dire ton réel objectif? d'avoir quel genre de liste à partir de quel genre de liste avec quelles restrictions?

    3- Utilise Random.nextInt() qui est beaucoup plus performant au lieu de Math.random() qui utilise Random.nextDouble() laquelle lui aussi utilise deux fois Random.next().

    Respecte aussi la règle de nomenclature de java, la première lettre d'un nom de variable doit être en minuscule et utiliser un camelCase.

    A+.

Discussions similaires

  1. Réponses: 2
    Dernier message: 07/10/2012, 01h18
  2. Réponses: 2
    Dernier message: 07/03/2012, 10h00
  3. [C#] Connaitre la colonne qui est cliquée dans un ListView
    Par omlip dans le forum Windows Forms
    Réponses: 3
    Dernier message: 03/12/2004, 20h01
  4. Ne pas afficher un champs qui est vide dans ma BD
    Par yoda_style dans le forum ASP
    Réponses: 3
    Dernier message: 27/04/2004, 11h40
  5. Afficher une image JPG qui se trouve dans une bdd
    Par Harry dans le forum Bases de données
    Réponses: 6
    Dernier message: 27/02/2004, 10h51

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