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

C++Builder Discussion :

nombre aleatoire toujours le même


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre extrêmement actif Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    2 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 2 037
    Par défaut nombre aleatoire toujours le même
    bonjour

    j'ai créé une petite fonction qui est sensé me générer un nombre aléatoire (rangé dans un tableau publique)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void __fastcall TForm1::CreerCodeAleatoireClick()
    {
    bool CodeExiste ;
    AnsiString Code ;
     
    CodeExiste = true; //initialisation
    randomize();
    do {      //on met une valeur aléatoire tant que le code proposé existe déjà dans la carte
            Code = FormatFloat("00000000",random(99999999));
            //Test si le code existe déjà ou pas
            CodeExiste = TestSiCodeExiste(Code);
    }while ( CodeExiste == true)  ;
    ...
    J'utilise cette fonction à 365 reprises dans une boucle et j'obtiens toujours le même résultat alors que si j'utilise cette fonction par appel d'un bouton j'ai bien un code différent à chaque fois...

    Auriez vous une explication à ce phénomène ?

    Merci par avance

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 573
    Par défaut
    postes un peu plus de code , stp ...

  3. #3
    Membre extrêmement actif Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    2 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 2 037
    Par défaut
    la voici

    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
     void __fastcall TForm1::Bt_RemplirDroitsExceptClick(TObject *Sender)
    {
    int IDjour ;
    long int AdresseEnCours ;
     
    AdresseDebutTableDroitsExceptionnels = IntToStr(Sauvegarde[AdresseDeAdresseDebutTableDroitsExceptionnels+PositionPremiereDATA])*256 + IntToStr(Sauvegarde[AdresseDeAdresseDebutTableDroitsExceptionnels+PositionPremiereDATA+1])+PositionPremiereDATA;
    AdresseEnCours = AdresseDebutTableDroitsExceptionnels  ;
    //mise à jour des adresses de début de table
    AdresseDebutTableLOGS = AdresseDebutTableDroitsExceptionnels + 2232 ; //calcul de la date de fin des droits exceptionnels
    Sauvegarde[15]= AdresseDebutTableLOGS/256  ;Sauvegarde[16]=AdresseDebutTableLOGS -((AdresseDebutTableLOGS/256)*256) ;
     
    for (int mois=1;mois<=12;mois++){
            for (int date=1 ; date<=31 ; date++){
                    IDjour = mois * 100 + date ;
                    CreerCodeAleatoireClick();//création d'un code aleatoire qui n'xiste pas déjà dans carte
                    //ici CodeAleatoire[0-3] contient le code en question
                    Sauvegarde[AdresseEnCours++]=  IDjour/256 ;
                    Sauvegarde[AdresseEnCours++]=  IDjour-((IDjour/256)*256) ;
                    Sauvegarde[AdresseEnCours++]=  CodeAleatoire[0];
                    Sauvegarde[AdresseEnCours++]=  CodeAleatoire[1];
                    Sauvegarde[AdresseEnCours++]=  CodeAleatoire[2];
                    Sauvegarde[AdresseEnCours++]=  CodeAleatoire[3];
            } //fin de for (date=1 ; date<=31 ; date++)
    }//fin de for (mois=1;mois<=12;mois++)
     
    //vider fin du fichier sauvegarde
    for (int i=AdresseDebutTableLOGS ; i <CapaciteMemoire ; i++){
            Sauvegarde[i]  = 0xFF ;
    }
    merci

  4. #4
    Membre éclairé Avatar de Baxter67
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 270
    Par défaut
    essai de mettre :
    juste avant le random

    je croie que sa peu réglé ton prob

    Cordialement Baxter

  5. #5
    Membre Expert
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Par défaut
    Randomize() ne dois être appelé qu'une seule fois en début de programme, puisqu'il initialise le générateur de nombre aléatoire.

    Il ne faut pas l'appeler à chaque fois que tu utilise random().

  6. #6
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 76
    Par défaut
    La raison des tes résultats tien dans le fait que de par la nature de l'informatique : 1 ou 0, l'aléatoire ne peut pas exister. La fonctions random n'est autre qu'une suite mathématique dont la moyenne = tjr 0.5. Cette fonction donne un résultat entre 0 et 1. Mais pour qu'il soit pas tjr le même il faut initialisé la formule mathématique a une certaine valeur. Et pour ça y'a la fonction randomize() qui est initialisé aléatoirement ( la vous pouvez rire ) de la maniéré suivante :

    Randomize initializes the built-in random number generator with a random value (obtained from the system clock)

    et comme le dit sat83 il n'est nécessaire d'exécuter cette routine qu'une seule fois même si le fait de le faire plusieurs fois ne devrais pas gener les résultats.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Prétentions salariales, toujours le même problème
    Par szdavid dans le forum Etudes
    Réponses: 32
    Dernier message: 06/05/2005, 11h17
  2. nombres aleatoires en plsql
    Par al85 dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 29/03/2005, 19h07
  3. Réponses: 4
    Dernier message: 14/06/2004, 09h29
  4. Réponses: 4
    Dernier message: 12/06/2003, 21h42
  5. nombre aleatoire
    Par Bob dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 17/06/2002, 18h12

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