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

Collection et Stream Java Discussion :

Comment remplir un tableau avec random sans doublon ?


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2010
    Messages : 1
    Par défaut Comment remplir un tableau avec random sans doublon ?
    Bonjour je suis nouveau en programmation, est ce quelqu'un veut bien m'aider à remplir un tableau avec aléatoirement avec un random sans doublon ? donc si le nombre exite déjà dans mon tableau je l'ignore et je rempli juste avec les nombres générés qui ne se trouve pas encore dans mon tableau.

    Je me suis un peu inspiré de l'exemple de recherche, qui se trouve sur le cours java( site zéro : section tableau ).

    Aidez-moi s'il vous plait, si vous avez une solution plus pratique et plus clair ou encore si vous pouvez m'expliquer qu'est ce qui ne va pas dans mon code et en me proposons une solution.

    Donc voici ce que j'ai fait : malheureusement il m'affiche des zéros partout.

    Merci d'avance.

    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<tab.length; i++)   // le tableau à 2 dimensions que je dois remplir   
    	{      
    	for(int j=0; j<tab[i].length; j++) {   
    		Random r = new Random();
                    int valeur = 1 + r.nextInt(9);
    	        tab_test[count] = valeur; // je rempli un tableau à 1 dimension pour faire mes tests
    	        count++;
     
    		while((count1 < tab_test.length) && (valeur!= tab_test[count1])){
    		    count1++;
    		    if(count1>tab_test.length) {
    		  	tab[i][j]= valeur; 
    		    }
                     }
           }
    }

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    342
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 342
    Par défaut
    tu ne peut pas utiliser des collection de set qui ne vont pas vouloir de doublon ?

  3. #3
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    Citation Envoyé par muntu Voir le message
    Bonjour je suis nouveau en programmation, est ce quelqu'un veut bien m'aider à remplir un tableau avec aléatoirement avec un random sans doublon ? donc si le nombre exite déjà dans mon tableau je l'ignore et je rempli juste avec les nombres générés qui ne se trouve pas encore dans mon tableau.

    Je me suis un peu inspiré de l'exemple de recherche, qui se trouve sur le cours java( site zéro : section tableau ).

    Aidez-moi s'il vous plait, si vous avez une solution plus pratique et plus clair ou encore si vous pouvez m'expliquer qu'est ce qui ne va pas dans mon code et en me proposons une solution.

    Donc voici ce que j'ai fait : malheureusement il m'affiche des zéros partout.

    Merci d'avance.

    for(int i=0; i<tab.length; i++) // le tableau à 2 dimensions que je dois remplir

    {
    for(int j=0; j<tab[i].length; j++)

    {


    Random r = new Random();
    int valeur = 1 + r.nextInt(9);

    tab_test[count] = valeur; // je rempli un tableau à 1 dimension pour faire mes tests

    count++;






    while((count1 < tab_test.length) && (valeur!= tab_test[count1]))

    {
    count1++;

    if(count1>tab_test.length) {

    tab[i][j]= valeur;
    }
    }
    }
    }
    pour être certain de remplir le tableau sans collision il faut commencer par mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int valeur = 1 + r.nextInt(length*length);


    pour votre problématique, vous pouvez aussi inverser la logique :

    au lieu de parcourir le tableau linéairement et mettre un nombre aléatoire dont vous devez vérifier qu'il n'a pas déjà été utilisé…
    remplissez le tableau en parcourant l'espace des valeurs (dans votre cas [1..length^2]) et ensuite mélangez-le de manière aléatoire…
    au moins le temps d'exécution sera toujours le même puisque vous déciderez une fois pour toute combien d'opérations de mélange (échanges de 2 éléments du tableau, rotations, …) vous effectuerez pour obtenir un "bon" mélange…
    et pour augmenter le caractère aléatoire vous pouvez aussi randomiser la position de départ du remplissage avant mélange…

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    173
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 173
    Par défaut
    Bonjour,

    Ce bout de code permet de remplir une matrice de taille déterminée de nombres aléatoire de entre -3 et 3

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Random;
     
    public class Main {
     
    	public static void main(String[] args) throws InterruptedException {
     
    		List<List<Integer>> list = new ArrayList<List<Integer>>();
     
    		final int nb = 3; // nb éléments
    		int colone = 0;
    int limite = 10;
    		while (colone < nb) {
    			int ligne = 0;
     
    			List<Integer> listTmp = new ArrayList<Integer>();
    			while (ligne < nb) {
    				Random r = new Random();
    				int nouvelElement = r.nextInt(limite);
     
    				if (!list.contains(nouvelElement)) {
    					listTmp.add(nouvelElement);
    					ligne++;
    				}
     
    			}
    			colone++;
    			list.add(listTmp);
    		}
     
    	}
     
    }
    En Java il est beaucoup plus pratique et conseiller de manipuler des List (ou Collection) plutot que des tab (int[]).

    Dans mon exemple, j'ai défini une matrice comme étant une liste de liste et lu le tableau selon une direction, c'est assez intuitif non?

    J'espère que ce bout de code convient

    N'hésite pas

  5. #5
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    Citation Envoyé par amine_en_france Voir le message
    Bonjour,

    Ce bout de code permet de remplir une matrice de taille déterminée de nombres aléatoire de entre -3 et 3
    ce genre de code n'aucune "scalability"… List.contains est O(n)…

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    173
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 173
    Par défaut
    Citation Envoyé par JeitEmgie Voir le message
    ce genre de code n'aucune "scalability"… List.contains est O(n)…
    Je ne comprends pas...

  7. #7
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Moi non plus. Mélanger au hasard ne peut pas être à la fois bien fait et bien scalable, il me semble.
    Ceci étant dit, ce n'est pas efficace de tourner en boucle jusqu'à tirer au hasard un nombre qui n'est pas déjà pris. Il faut tirer au hasard un nombre parmi ceux qui ne sont pas déjà pris.
    Rien à voir avec la complexité de List.contains(), par contre.

    Et puis bon, au final si c'est pour faire des solutions trop compliquées, autant faire ça tout de suite avec Collections.shuffle().
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    Citation Envoyé par amine_en_france Voir le message
    Je ne comprends pas...
    pour des petites quantités de données, çà ne se voit pas…
    essayer de remplir un tableau important… vous allez vite comprendre…

    non seulement les techniques consistant à garder une trace des nombres déjà utilisés utilisent 2x plus de mémoire (le tableau et la structure)
    mais en plus le code pour tester si le nombre a déjà été utilisé est de plus en plus lent… et de ce point de vue List.contains est bien pire que Hash.get…

    si au moins la structure maintenant les nombres utilisés était un bitset… vous ne consommeriez que (nombre d'éléments / nombre de bits dans un Long)
    et le temps d'exécution du test d'utilisation d'un nombre serait linéaire…

Discussions similaires

  1. Réponses: 2
    Dernier message: 25/02/2014, 14h38
  2. [Débutant] comment remplir un tableau sous excel avec des données de DGV?
    Par spring.time dans le forum VB.NET
    Réponses: 6
    Dernier message: 26/10/2012, 20h36
  3. Réponses: 1
    Dernier message: 13/04/2011, 09h44
  4. [C#] Comment remplir un tableau avec un arraylist
    Par Cazaux-Moutou-Philippe dans le forum Windows Forms
    Réponses: 9
    Dernier message: 22/06/2006, 15h14
  5. [TChart] comment remplir un histogramme avec du rouge strié.
    Par :GREG: dans le forum Composants VCL
    Réponses: 2
    Dernier message: 12/08/2002, 09h37

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