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 Discussion :

Générateur de nombre aaléatoire et passage en parametre d'un tableau à une fonction


Sujet :

C

  1. #1
    Membre du Club
    Homme Profil pro
    Cycles en Informatique
    Inscrit en
    Juin 2007
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Cycles en Informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2007
    Messages : 67
    Points : 51
    Points
    51
    Par défaut Générateur de nombre aaléatoire et passage en parametre d'un tableau à une fonction
    Bjr
    Probleme avec l'affichage des nombre aléatoire de la fonction ,il me genere les meme est ce que c'est la boucle qui ne fonctioonne pa stres bien Merci

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    loat fonct(float tab[],int N)
    {
    int min,i;
    min=tab[0];
    for(i=1;i<10;i++)
    { if(tab[i]<min)
    { min=tab[i];
    }
    }
    return min;
    }
    //int foct(int tab[], int g,int d)
    //{}
    float gene_loi(float tau)
    {
    unsigned long int a,n,i,p,m,uo,d,T[128];
    float k[128],f,x=2.0;
    i=1;
    a=69069;
    uo=131; /* nombre premier impaire */
    m=(int)pow(x,30);
    n=1;
    while(i<=128)
    { n=n*a;
    T[i]= (n*uo)%m;
    k[i]=(1./m)*T[i];
    i=i+1;
    }
    srand( time(NULL));
    d=rand()%128;
    f = -(1/tau)*log(k[d]);
    printf(".6%f\n",f);
    return f;
    }
    int main()
    {
    float t[10],min;
    int i;
     
    for(i=1;i<10;i++)
    {
    t[i]=gene_loi(para);
    printf("les valeur du tableau des lois: %f\n",t[i]);
    }
    min=fonct(&t[0], 10);
    printf("la valeur minimale est :%f\n",min);
    return 0;
    }

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 266
    Points : 161
    Points
    161
    Par défaut
    Indenter ton code le rendrait bien plus lisible.
    Sinon pour savoir d'où vient ton problème, dans un premier temps tu devrais afficher les valeurs dans tes boucles avec des printf vu qu'apparement t'es en mode console. Ainsi tu verrais étape par étape la création de tes nombres aléatoires et tu trouverais où ils ne diffèrent pas l'un de l'autre.

  3. #3
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 723
    Points
    5 723
    Par défaut
    On fait 1 et 1 seule fois le srand dans le programme notamment dans main et pas dans une fonction comme tu fais

  4. #4
    Membre du Club
    Homme Profil pro
    Cycles en Informatique
    Inscrit en
    Juin 2007
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Cycles en Informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2007
    Messages : 67
    Points : 51
    Points
    51
    Par défaut
    En faite tu vois le generatur teste lui seul comme prog marche tres bien mais appele comme fonction dans un autres programme n'affiche que toujour la meme valeur sur la taille de la boucle. je pense que c'est dans le main() le prob mais exactement ou dans la boucle ou pas

  5. #5
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Executé comme programme, ça semble marcher parce que d'une exécution à l'autre, time(NULL) prend des valeurs différentes.
    Dans une boucle,time(NULL) n'a pas le temps de changer (ou très rarement et par hasard)
    hegros t'a donné la réponse :Retire le srand de gene_loi et place le dans le main au début avant la boucle.

  6. #6
    Membre du Club
    Homme Profil pro
    Cycles en Informatique
    Inscrit en
    Juin 2007
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Cycles en Informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2007
    Messages : 67
    Points : 51
    Points
    51
    Par défaut
    ça resoud le premier probleme mais si je passe ce passe tableau à la fonction min il me retourne o

  7. #7
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par boula
    Bjr
    Probleme avec l'affichage des nombre aléatoire de la fonction ,il me genere les meme est ce que c'est la boucle qui ne fonctioonne pa stres bien Merci
    <...>
    Je ne sais pas ce que tu veux faire, mais srand() est mal placé. Je ferais comme ceci :
    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
     
    #include <stdlib.h>
    #include <math.h>
    #include <time.h>
    #include <stdio.h>
     
    double get_min (double tab[], int n)
    {
       int min, i;
       min = tab[0];
       for (i = 1; i < n; i++)
       {
          if (tab[i] < min)
          {
             min = tab[i];
          }
       }
       return min;
    }
     
    //int foct(int tab[], int g,int d)
    //{}
    double gene_loi (double tau)
    {
       unsigned long int a, n, i, m, uo, d, T[128];
       double k[128], f, x = 2.0;
       i = 1;
       a = 69069;
       uo = 131;                    /* nombre premier impaire */
       m = (int) pow (x, 30);
       n = 1;
       while (i <= 128)
       {
          n = n * a;
          T[i] = (n * uo) % m;
          k[i] = (1. / m) * T[i];
          i = i + 1;
       }
       d = rand () % 128;
       f = -(1 / tau) * log (k[d]);
       printf (".6%f\n", f);
       return f;
    }
     
    int main (void)
    {
       double t[10], min;
       int i;
       double para = 1.5;
     
       srand (time (NULL));
     
       for (i = 1; i < 10; i++)
       {
          t[i] = gene_loi (para);
          printf ("les valeur du tableau des lois: %f\n", t[i]);
       }
       min = get_min (t, 10);
       printf ("la valeur minimale est :%f\n", min);
       return 0;
    }
    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
     
    .60.153317
    les valeur du tableau des lois: 0.153317
    .60.401879
    les valeur du tableau des lois: 0.401879
    .60.295932
    les valeur du tableau des lois: 0.295932
    .60.827031
    les valeur du tableau des lois: 0.827031
    .60.983829
    les valeur du tableau des lois: 0.983829
    .60.699592
    les valeur du tableau des lois: 0.699592
    .61.687101
    les valeur du tableau des lois: 1.687101
    .60.417710
    les valeur du tableau des lois: 0.417710
    .60.699592
    les valeur du tableau des lois: 0.699592
    la valeur minimale est :-2147483648.000000
     
    Press ENTER to continue.

  8. #8
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    ça resoud le premier probleme mais si je passe ce passe tableau à la fonction min il me retourne o
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    float fonct(float tab[],int N)
    {
      float min;
      int i;
      min=tab[0]; // si int min ,  min = partie entière de tab[0]
      for(i=1;i<N;i++)
         if(tab[i]<min) min=tab[i];
      return min;
    }

  9. #9
    Membre du Club
    Homme Profil pro
    Cycles en Informatique
    Inscrit en
    Juin 2007
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Cycles en Informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2007
    Messages : 67
    Points : 51
    Points
    51
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Program received signal SIGSEGV, Segmentation fault.
    0x080486d0 in main ()
    Program received signal SIGSEGV, Segmentation fault.
    0x080486d0 in main ()

  10. #10
    Membre du Club
    Homme Profil pro
    Cycles en Informatique
    Inscrit en
    Juin 2007
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Cycles en Informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2007
    Messages : 67
    Points : 51
    Points
    51
    Par défaut
    Resolu avec la boucle qui commence par 0
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     float fonct(float tab[],int N)
    {
      float min;
      int i;
      min=tab[0]; // si int min ,  min = partie entière de tab[0]
      for(i=0;i<N;i++)
         if(tab[i]<min) min=tab[i];
      return min;
    }

  11. #11
    Membre du Club
    Homme Profil pro
    Cycles en Informatique
    Inscrit en
    Juin 2007
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Cycles en Informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2007
    Messages : 67
    Points : 51
    Points
    51
    Par défaut
    J'essai avec le gcc -g mini.c -o mini
    (gdb) run
    il m'afficher :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     /tmp/ccYRscOi.o: dans la fonction « gene_loi »:
    /users/huron/iamadou/mini.c:27: référence indéfinie vers « pow »
    /users/huron/iamadou/mini.c:37: référence indéfinie vers « log »
    collect2: ld returned 1 exit status

  12. #12
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Il faut faire le lien avec la bibliotheque mathematique (libm):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    gcc -W -Wall -ansi -pedantic mini.c -o mini -lm

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 16/04/2007, 13h39
  2. Réponses: 3
    Dernier message: 15/06/2006, 11h48
  3. Réponses: 8
    Dernier message: 10/03/2006, 17h28
  4. Passage en parametre d'un tableau
    Par hak5 dans le forum C
    Réponses: 3
    Dernier message: 13/01/2006, 11h32

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