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

Linux Discussion :

Réels aléatoires sous Linux(GCC)


Sujet :

Linux

  1. #1
    Nouveau membre du Club
    Inscrit en
    Août 2007
    Messages
    30
    Points
    27
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 30
    Points : 27
    Par défaut Réels aléatoires sous Linux(GCC)
    Salut tous le monde,

    j'essaie de remplir un tableau de float par des réels aléatoires, j'ai donc utilisé la fonction rand() après avoir initialiser srand() pour ne pas génerer la meme suite de nombres après chaque execution. Sachant que la fonction rand() renvoie un entier et non pas un réel, j'ai utilisé le petit bout de code suivant pour avoir des réels disant pseudo-aléatoires car un aléatoire n'existe pas vraiment en info.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(i=0;i<n;i++) T[i]=rand()+(float)rand()/RAND_MAX;
    quand j'affiche mon tableau sous windows:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(i=0;i<n;i++) printf("%f\n",T[i]);
    tout à l'air de marcher:
    pour n=4 par exemple, ca donne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    23890.898438
    30356.031250
    8303.141602
    26744.281250
    mais sous linux c vraiment different malgrais la portabilité du code utilisé:

    avec n=4 ca donne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    13855.000000
    2318709.000000
    64865.000000
    7432076.000000
    ca m'affiche uniquement des entiers; pas de chiffres après la virgules comme vous voyez, alors que si j'utilise uniquement le script:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(i=0;i<n;i++) T[i]=(float)rand()/RAND_MAX;
    ca me génerent des réels alétoires entre 0 et 1, car rand() renvoie un entier entre 0 et la constante RAND_MAX, donc en utilisant rand()/RAND_MAX avec un cast (float) on est toujours sur que le nombre généré est compris entre 0 t 1.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    000000.898438
    000000.031250
    000000.141602
    000000.281250

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 759
    Points
    31 110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 759
    Points : 31 110
    Billets dans le blog
    1
    Par défaut
    Tu travailles avec des float ? Alors pourquoi ne pas remplir chacun des 4 octets de ton float avec un nombre aléatoire compris entre 0 et 255 ?

  3. #3
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Points
    17 923
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par rhani-sama Voir le message
    mais sous linux c vraiment different malgrais la portabilité du code utilisé:

    avec n=4 ca donne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    13855.000000
    2318709.000000
    64865.000000
    7432076.000000
    ca m'affiche uniquement des entiers; pas de chiffres après la virgules comme vous voyez, alors que si j'utilise uniquement le script:
    Normal

    ton numérateur, même passé en float, reste un entier..

    Et comme ton DIVISEUR est entier, la division est entière..

    Il suffit d'écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    T[i] = (float)rand() + ((float)rand() / (float)RAND_MAX) ;
    et je pense que ça marchera aussi si tu enlèves le cast du deuxième rand...

    et les parenthèses , pour ma part, je les spécifie toujours, car je ne veux pas dépendre de l'ordre d'évaluation..

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 759
    Points
    31 110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 759
    Points : 31 110
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    Normal

    ton numérateur, même passé en float, reste un entier..

    Et comme ton DIVISEUR est entier, la division est entière..
    Non. Dans une opération a 2 opérandes avec opérandes de différents types, l'opération est réalisée dans le type le plus précis des deux.
    Ex: double a=7.0 / (int)2 => a=3.5

    Si l'opération fait intervenir plus de 2 opérandes, alors elle est découpée en "n" opérations de 2 opérandes (selon les règles des priorités) et chaque opération est réalisée selon les règles ci-dessus

    Ex: double a=5.0 + 3 / 2 => D'abord le 3/2 est évalué dans le type le plus précis des deux int => donne 1 qui, additionné au 5.0 te donne 6.0

    Citation Envoyé par souviron34 Voir le message
    et je pense que ça marchera aussi si tu enlèves le cast du deuxième rand...
    Là oui (cela ramène au 1er exemple)

    Citation Envoyé par souviron34 Voir le message
    et les parenthèses , pour ma part, je les spécifie toujours, car je ne veux pas dépendre de l'ordre d'évaluation..
    Boaf. Tant qu'on reste aux opérateurs mathématiques on peut s'en passer. Mais t'as quand-même bien fait de répondre car cela m'a donné une idée de la vraie cause du problème

    Citation Envoyé par rhani-sama Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    T[i]=rand()+(float)rand()/RAND_MAX;
    Quand tu fais float()rand()/RAND_MAX, je pense que le cast "float()" est appliqué sur "(rand()/RAND_MAX)". Or, il faudrait l'appliquer sur "rand()" avant de diviser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    T[i]=rand()+((float)rand())/RAND_MAX;

    [edit qq heures plus tard]
    Non, j'ai dit une connerie. Le cast est prioritaire sur la division. autrement dit, que tu fasses "(float)3 / 2" ou ((float) 3) / 2)" t'obtiens toujours 1.5.

    Aujourd'hui, j'ai tapé le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
        int i;
        for(i=0;i<n;i++)
           printf("%f\n", rand()+(float)rand()/RAND_MAX);
    }
    Ben ça m'a fait exactement comme prévu, à savoir affiché une suite de réels aléatoires donc je pige pas pourquoi ça ne marche pas chez toi...

Discussions similaires

  1. [operator] probleme seulement sous linux gcc 4.4.6
    Par ikeas dans le forum Langage
    Réponses: 14
    Dernier message: 13/01/2015, 12h12
  2. gcc sous linux
    Par y.medium dans le forum Applications et environnements graphiques
    Réponses: 20
    Dernier message: 21/11/2007, 13h08
  3. [Makefile] GCC sous Linux : /usr/bin/ld: cannot find -lsocket
    Par erroneus dans le forum Systèmes de compilation
    Réponses: 1
    Dernier message: 25/05/2007, 17h26
  4. Temps réel Embarqué sous linux
    Par naima2005 dans le forum Administration système
    Réponses: 1
    Dernier message: 08/01/2007, 07h46
  5. [débutant]compiler avec gcc sous linux
    Par Ickou dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 10/03/2006, 18h27

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