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

Calcul scientifique Python Discussion :

génération de nombres avec des critères précis


Sujet :

Calcul scientifique Python

  1. #1
    Membre à l'essai Avatar de yugure
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2016
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2016
    Messages : 38
    Points : 21
    Points
    21
    Par défaut génération de nombres avec des critères précis
    Bonsoir,
    je dois générer des nombres avec ce critère :
    "Your random number generator should produce 32-bit integers in hex form, 8 hex 'digits' per
    integer, 10 integers per line, no intervening spaces"
    C'est à dire il faut que lorsque je génère mes fichiers avec mes nombres alétoires , il me faut 8 hex digit par ligne
    comment est-ce possible en python ?

  2. #2
    Membre éclairé
    Profil pro
    Ingénieur sécurité
    Inscrit en
    Février 2007
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 574
    Points : 751
    Points
    751
    Par défaut
    Salut,

    Ca parait un peu complique, parce que je sais pas si tu as une limite haute, ...

    Un truc generique:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    import codecs
    import itertools
    import os
     
    def my_rand(word_size=4, limit=None):
        for _ in itertools.takewhile(lambda x: True  if limit is None else x < limit, itertools.count()):
            yield codecs.encode(os.urandom(word_size), "hex")
    Apres tu inseres un saut de ligne tout les modulo 10 chiffres:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for i, v in enumerate(my_rand(limit=25)):
        end = ""
        if (i + 1) % 10 == 0:
            end = os.linesep
        print(v.decode("ascii"), end=end)
    Tout ca peut etre plus simple si tu prends juste 40 bytes aleatoire eu lieu de travailler sur des ints directement.

  3. #3
    Membre à l'essai Avatar de yugure
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2016
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2016
    Messages : 38
    Points : 21
    Points
    21
    Par défaut
    Et si je dispose déjà d'un générateur que je veux utiliser comment je pourrais adapter la fonction s'il vous plait ?
    mon generateur est generator :
    c'est bon si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    def user(y):
        for i, v in enumerate(generator(y)):
            end = ""
            if (i + 1) % 10 == 0:
                end = os.linesep
                print(v.decode("ascii"), end=end)

  4. #4
    Membre éclairé
    Profil pro
    Ingénieur sécurité
    Inscrit en
    Février 2007
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 574
    Points : 751
    Points
    751
    Par défaut
    Citation Envoyé par yugure Voir le message
    Et si je dispose déjà d'un générateur que je veux utiliser comment je pourrais adapter la fonction s'il vous plait ?
    mon generateur est generator :
    c'est bon si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    def user(y):
        for i, v in enumerate(generator(y)):
            end = ""
            if (i + 1) % 10 == 0:
                end = os.linesep
                print(v.decode("ascii"), end=end)
    Quasiment oui, mais probleme d'intentation:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    def user(y):
        for i, v in enumerate(generator(y)):
            end = ""
            if (i + 1) % 10 == 0:
                end = os.linesep
            print(v.decode("ascii"), end=end)

  5. #5
    Membre à l'essai Avatar de yugure
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2016
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2016
    Messages : 38
    Points : 21
    Points
    21
    Par défaut
    ça m'affiche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Traceback (most recent call last):
      File "<pyshell#0>", line 1, in <module>
        user(20)
       line 24, in user
        for i, v in enumerate(generator(y)):
    TypeError: 'int' object is not iterable

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 239
    Points : 36 692
    Points
    36 692
    Par défaut
    Citation Envoyé par yugure Voir le message
    ça m'affiche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Traceback (most recent call last):
      File "<pyshell#0>", line 1, in <module>
        user(20)
       line 24, in user
        for i, v in enumerate(generator(y)):
    TypeError: 'int' object is not iterable
    Pour pouvoir utiliser ce bout de code, votre generateur de nombres aléatoires doit aussi être un generateur Python qui retourne une chaîne de caractères de 8 digits hexadécimaux. Un truc comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    import random
    def my_rand(limit=None):
        for _ in range(limit):
            yield '%08X' % random.randint(0, 100)
    devrait être conforme à cette interface.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre à l'essai Avatar de yugure
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2016
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2016
    Messages : 38
    Points : 21
    Points
    21
    Par défaut génération de fichiers en hex
    Bonjour,
    je dispose d'un générateur de nombres aléatoires et je génère des fichiers avec ces nombres aléatoires.
    je veux que mes fichiers contiennent mes nombres générés en hexadécimal avec 8 digit par ligne .
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
              fichier = open("test.txt","w")
              for k in range(n):
                  v=generator(x)
                  fichier.writelines(v)
             fichier.close()
    Voici mon code , mais je veux ce critère dans la génération du fichier sachant que mon générateur générer des nombres qui sont déjà en hexadécimal.
    Merci d'avance.

  8. #8
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Août 2014
    Messages : 50
    Points : 58
    Points
    58
    Par défaut génération de nombres avec des critères précis
    Bonjour Yugure,

    Je te prose cette idée :

    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
     
     
    #!/usr/bin/python
    # coding: utf-8
     
    import random
     
    # a = un nombre aléatoire entre 0 et 4294967295 (0x0 - 0xffffffff)
    a = random.randint(0,65874)
    print "nombre a=",a
     
    # convertion du nombre entier en une string hexadecimal
    print "nombre a en base 16=",hex(a)
    a = hex(a)
     
    # on enleve le 0x ou on le garde c est toi qui voit
    a = a.split("0x")[1]
     
    # on ajuste l'affichage à 8 digits
    a = a.zfill(8)
    print "nombre a en base 16 avec 8 digits=",a
    print "nombre a en base 16 avec 8 digits grand format=",a.upper()
     
    # on essaye d ouvrir le fichier dans lequel on va copier notre hexa puis on ferme
    try:
        fichier = open("test.txt",'w')
        fichier.write(a)
        fichier.close()
    except:
        print "Erreur de lecture/ecriture"
     
    # EOF
    ce mode me donne le rendu suivant :

    nombre a= 55658
    nombre a en base 16= 0xd96a
    nombre a en base 16 avec 8 digits= 0000d96a
    nombre a en base 16 avec 8 digits grand format= 0000D96A

    et j'ai bien un fichier test.txt avec 0000d96a

    Cordialement,
    Sunrise

  9. #9
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2010
    Messages : 553
    Points : 2 740
    Points
    2 740
    Par défaut
    Yo!

    on peut générer une chaine de 8 caractères hexadécimaux représentant un entier avec la fonction str.format:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "{:08X}".format(un_entier)
    dans le format {:08X}:
    • le : indique qu'on va spécifier un format particulier
    • le 0 sert de caractère de remplissage dans le cas ou le résultat c'est pas assez grand pour atteindre la taille voulue
    • le 8 indique qu'on veut une chaine de 8 caractères
    • le X indique qu'on veut la représentation hexadécimale de l'entier avec les lettres en majuscule (on aurait pu utiliser x pour des lettres en minuscule)

    edit: c'est équivalent à ce qu'a proposé Wiztricks avec '%08X' % un entier

    générer un entier sur 32 bits n'est pas très compliqué non plus:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    random.randint(0, 2 ** 32 - 1)
    le reste ne devrait pas poser de problème

Discussions similaires

  1. ouvrir un formulaire avec un critère précis, est-ce possible?
    Par Utilisateur débutant dans le forum IHM
    Réponses: 4
    Dernier message: 02/01/2008, 12h09
  2. Réponses: 24
    Dernier message: 01/06/2007, 22h37
  3. Réponses: 1
    Dernier message: 08/03/2007, 11h55
  4. Formater un nombre avec des séparateurs de milliers
    Par lagotonio dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 23/02/2007, 20h23
  5. [Format]nombres avec des 0
    Par zozolh2 dans le forum API standards et tierces
    Réponses: 6
    Dernier message: 01/06/2004, 09h43

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