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

Algorithmes et structures de données Discussion :

Génération de codes aléatoires uniques


Sujet :

Algorithmes et structures de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut Génération de codes aléatoires uniques
    Bonjour.
    J'aimerais générer un nombre important de séquences alphanumériques aléatoires (de même taille, les lettres et les chiffres placés au mêmes endroits) sans doublons.
    Ça, pas de souci je sais faire.

    En fait, j'ai un problème d'optimisation.
    L'approche naïve que j'emploie est la suivante :
    1. Générer une séquence aléatoire
    2. Vérifier qu'elle n'a pas déjà été générée
    3. Si oui, revenir au 1.
    4. Enregistrer la nouvelle séquence
    En continuant tant que le quota n'est pas atteint.

    Évidemment, plus ça va, plus c'est lent…
    N'y aurait-il pas une approche plus rapide, plus efficace ?
    Peut-être spécifique à un langage particulier ?

    Si vous avez des suggestions, je suis tout ouïe.

    PS: Je ne suis pas encore décidé sur le langage.
    C, C++, Java, Perl, Python…

  2. #2
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Bonjour,

    Citation Envoyé par Steph_ng8 Voir le message
    N'y aurait-il pas une approche plus rapide, plus efficace ?
    On peut créer une relation d'ordre sur les séquences. Pour ton cas précis, on peut même créer une séquence unique à partir d'un nombre d'ordinal.

    Exemple simple : Un code du genre [lettre][lettre][chiffre]

    On assigne pour chaque lettre un numero de 1 à 26, et pour chaque chiffre un numéro de 0 à 9. On peut donc décrire chaque séquence possible avec ces 3 valeurs.

    Si on considère A=1, B=2, ... on obtient, par exemple :

    numero d'ordre (05,07,8) ---> E G 8

    Pour être certain de ne pas retomber sur une séquence existante, il suffit de prendre comme prochain numéro d'ordre un numero strictement supérieur à l'actuel.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  3. #3
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut
    Citation Envoyé par pseudocode Voir le message
    On peut créer une relation d'ordre sur les séquences.
    Il y a déjà une relation d'ordre : l'ordre lexicographique.
    Ce qui revient à peu de choses à ce que tu as mis.

    Citation Envoyé par pseudocode Voir le message
    Pour être certain de ne pas retomber sur une séquence existante, il suffit de prendre comme prochain numéro d'ordre un numero strictement supérieur à l'actuel.
    Et comment on le « prend » ?

  4. #4
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Citation Envoyé par Steph_ng8 Voir le message
    Et comment on le « prend » ?
    Au hasard. Par exemple par dichotomie.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  5. #5
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut
    Ah, je crois que je commence à voir où tu veux en venir.
    Au lieu de générer aléatoirement tous les caractères de la séquence, puis de vérifier si elle n'a pas déjà été générée, tu proposes de tous les mettre à plat et de « choisir » le numéro X, puis le numéro Y, etc.
    Enfin de construire la séquence à partir du numéro (d'ordre) générer.

    Ça permet entre autres de ne faire qu'un seul tirage pseudo-aléatoire, puis si la vérification est nécessaire, elle se fait sur un entier, et pas sur une séquence de caractères.

    Si j'ai bien compris, ça me paraît une très bonne idée.

    Reste à s'assurer que tous les numéros d'ordre sont représentables…

  6. #6
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Citation Envoyé par Steph_ng8 Voir le message
    Ah, je crois que je commence à voir où tu veux en venir.
    Au lieu de générer aléatoirement tous les caractères de la séquence, puis de vérifier si elle n'a pas déjà été générée, tu proposes de tous les mettre à plat et de « choisir » le numéro X, puis le numéro Y, etc.
    Enfin de construire la séquence à partir du numéro (d'ordre) générer.
    Oui, c'est ca.

    Reste à s'assurer que tous les numéros d'ordre sont représentables…
    Il le sont forcément (ton nombre d'élément est fini). Par contre, il est vrai que ce n'est pas forcément trivial de passer d'un numero d'ordre à l'élément correspondant.

    Si on reprend l'exemple [lettre1][lettre2][chiffre]

    en posant a=0, b=1, ..., z=25

    alors un numero d'ordre peut être

    numordre = #lettre1*26*10 + #lettre2*10 + #chiffre

    et inversement

    #chiffre = numordre % 10
    #lettre2 = (numordre-chiffre)/10 % 26
    #lettre3 = (numordre-chiffre-#lettre2*10)/(10*26) % 26

    (aux erreurs de calculs près, en cet heure tardive)


    Ça permet entre autres de ne faire qu'un seul tirage pseudo-aléatoire, puis si la vérification est nécessaire, elle se fait sur un entier, et pas sur une séquence de caractères.
    En procédant par dichotomie pour les tirages, tu peux te passer de la vérification. Il suffit de tirer un numero d'ordre dans un des intervalles

    Par exemple, si on imagine 100 numeros d'odre possible:
    >intervalles : [0,100[
    tirage : 33

    ->intervalles : [0,33[ & ]33,100[
    tirage : 54

    ->intervalles : [0,33[ & ]33,54[ & ]54,100[
    ...
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

Discussions similaires

  1. Génération d'une nombre aléatoire unique
    Par jopont dans le forum BIRT
    Réponses: 18
    Dernier message: 30/06/2013, 08h49
  2. [AC-2003] Génération d'un code Aléatoire et Unique (fin de projet)
    Par Popperwin dans le forum VBA Access
    Réponses: 15
    Dernier message: 26/05/2009, 16h08
  3. Génération d'une clé unique aléatoire
    Par DeadSoul dans le forum Oracle
    Réponses: 6
    Dernier message: 01/12/2005, 11h07
  4. [UML] génération de code avec omondo.uml
    Par RENAULT dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 31/10/2003, 13h14
  5. [Lomboz] Génération de code pour EJB
    Par paikan dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 09/07/2003, 14h28

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