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 :

Generer valeur aleatoir entre -0.5 et 0.5


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2004
    Messages : 13
    Par défaut Generer valeur aleatoir entre -0.5 et 0.5
    C'est une question tres stupide en effet mais pas tres evidence en meme temps car les nombres que je suis arrive a generer etaient tous positifs.
    Je sais que je peux multiplier pas -1 mais cela ne les rendrais pas RANDOM.
    Le but est de les utiliser comme poids dans un programme de simulation de reseaux de neurones.
    Autre chose comment faire pour avoir des nombre de type float en memoire du genre 0.56544848 transformer en 0.56

    Merci beaucoup

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut Re: Generer valeur aleatoir entre -0.5 et 0.5
    Citation Envoyé par sparrow
    C'est une question tres stupide en effet mais pas tres evidence en meme temps car les nombres que je suis arrive a generer etaient tous positifs.
    Je suis un brèle en math, mais je pense qu'il suffit de générer de 0 à n-1 et de décaler de le résultat de -n/2...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Autre chose comment faire pour avoir des nombre de type float en memoire du genre 0.56544848 transformer en 0.56
    Cette question n'a aucun sens. La représentation des nombres réels en C est de type 'virgule flottante', c'est à dire signe, mantisse, exposant. Il n'y a pas de format à virgule fixe en C.

    Ce qui peut éventuellement changer, c'est la représentation textuelle lors de la conversion avec *printf().

  3. #3
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Par défaut
    Bonjour,

    effectivement, c'est à mon avis la meilleure solution :
    - Tu génères aléatoirement un entier "n" en 0 et N (N inclu surtout)
    - Tu divises n par N (donc x=n/N varie entre 0.0 et 1.0, attention aux types)
    - Puis tu décales de -0.5 (donc x varie entre -0.5 et 0.5)

    bon courage...
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  4. #4
    Membre éprouvé
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Mai 2002
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Mai 2002
    Messages : 114
    Par défaut
    En gros je répète les écrits ToTo13 et Emmanuel Delahaye en plus simple :
    rand renvoyant en nombre entre [0;1] (ou ]0;1] ou [0;1[, je sais jamais trop), X sera dans [-0.5;0.5] (ou ]-0.5;0.5],...).

    Pour ce qui est de transformer 0.56544848 en 0.56, je ne comprend pas trop ce que tu veux faire :
    - Afficher 0.56 à l'écran (printf) ?
    - Arrondir (ou plutôt tronquer d'après ton exemple) 0.56544848 en 0.56?
    - autre chose qui me dépasse

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    C'est faux, rand() en C renvoit un nombre entier entre 0 et RAND_MAX (souvent défini à 32767)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre éprouvé
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Mai 2002
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Mai 2002
    Messages : 114
    Par défaut
    Ah oui c'est vrai. A force d'utiliser des bilbiothèque j'en fini par l'oublier . Donc tu fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    X = rand() / RAND_MAX -0.5;
    Avec un include <math.h> avant.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Teuchteu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    X = rand() / RAND_MAX -0.5;
    Euh, non...
    Avec un include <math.h> avant.
    Pourquoi ? Et rien sur <stdlib.h> ?

  8. #8
    Membre éprouvé
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Mai 2002
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Mai 2002
    Messages : 114
    Par défaut
    Tiens j'ai retrouver des petites fonctions pour ça. C'est des trucs à 2 balles (certains risquent même de les trouver très moches) mais bon :

    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
     
    #include <stdlib.h>
    #include <math.h>
     
    float f_pif(float min,float max) {
        float result;
        //result = (float) (drand48()*(max-min)+min);
        result = (float) ( ( ( rand() * (max-min) ) / RAND_MAX ) + min );
    return result;
    }
     
    int i_pif (int min,int max) {
        int result;
        //result = (int) (lrand48()*(max-min)+min);
        result = i_round( ((float)(rand()*(max-min))) / ((float) RAND_MAX) ) + min ;
    return result;
    }
    Avec i_round une fonction qui arrondi genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return (((floor(X)-X)>=0.5)?((int) (floor(X)+1)):((int) (floor(X))));
    Les fonctions en commentaires (//) existent sous Linux mais ne sont pas forcément portables.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2004
    Messages : 13
    Par défaut
    Merci beaucoup pour votre aide.Desole de poser ce genre de question mais ca fait un bail que je n'ai pas programmer en C vu que je fais du JAVA/Perl et ca me formatte la memoire.Je suis arriver a faire marcher mon programme avec des valeurs statique d'abord.Je vais essayer de voir comment faire marcher au mieux vos suggestions.Et oui j'aimerais bien rendre mon float avec une valeur 0.56 au lieu de 0.565948956 car si l'on utilise floor() , ceil(), truc(),round() on obtient zero.

    Merci encore pour votre soutien

  10. #10
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Citation Envoyé par sparrow
    Et oui j'aimerais bien rendre mon float avec une valeur 0.56 au lieu de 0.565948956 car si l'on utilise floor() , ceil(), truc(),round() on obtient zero
    Ce qui est normal, puisque l'entier plus petit que 0.56 est 0.
    Il convient de faire la difference entre la representation interne des valeurs (on n'en sait rien et on s'en moque) et leur affichage vers l'exterieur.
    printf() a des formatteurs qui vont bien, par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      float a = 0.565948956;
     
      printf("%.2f\n", a);
    donnera bien
    0.57
    .

  11. #11
    Membre éprouvé
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Mai 2002
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Mai 2002
    Messages : 114
    Par défaut
    C'est peut-être pas très propre, mais tu peux multiplier ton nombre par 100, faire un floor et le diviser par 100. Tu obtiendras ce que tu cherche.

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2004
    Messages : 13
    Par défaut
    Merci beaucoup.Votre aide m'a ete tres precieuse.

  13. #13
    Membre éprouvé Avatar de SaintAmand
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 174
    Par défaut
    Citation Envoyé par Teuchteu
    C'est peut-être pas très propre, mais tu peux multiplier ton nombre par 100, faire un floor et le diviser par 100. Tu obtiendras ce que tu cherche.
    Je ne crois pas. En effet la fonction floor est la fonction partie entière.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Si x=-0.2321, floor(100*x)/100 = floor(-23.21)/100 = -24/100 = -0.24
    Or, si j'ai bien compris, sparrow aimerait plutot obtenir -0.23. Moi je lui propose donc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    x = (int)(100*x)/100.0;
    --
    SaintAmand, un débutant.

  14. #14
    Membre éprouvé
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Mai 2002
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Mai 2002
    Messages : 114
    Par défaut
    Citation Envoyé par SaintAmand
    Je ne crois pas. En effet la fonction floor est la fonction partie entière.
    La fonction floor n'est pas la fonction partie entière mais la fonction arrondi par valeur inférieure (la partie entière de -23.21 est -23, la valeur entière immédiatement inférieur est -24).

    Cela-dit, il faut adapter l'arrondi à ce que l'on veut faire. Et sparrow ne précise pas qu'elle type d'arrondi il désire.

  15. #15
    Membre éprouvé Avatar de SaintAmand
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 174
    Par défaut
    Citation Envoyé par Teuchteu
    La fonction floor n'est pas la fonction partie entière mais la fonction arrondi par valeur inférieure (la partie entière de -23.21 est -23, la valeur entière immédiatement inférieur est -24).
    Permettez-moi d'insister. Mais en mathématiques, on définit bien la partie entière d'un réel x comme étant le plus grand entier inférieur ou égal à x. Je vous renvoie à vos lointains cours de lycée pour confirmation. ;-)

    --
    SaintAmand

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 12/04/2015, 23h16
  2. probleme de valeur aleatoire
    Par skwi6 dans le forum Collection et Stream
    Réponses: 10
    Dernier message: 16/11/2006, 12h18
  3. Réponses: 2
    Dernier message: 22/05/2006, 16h38
  4. recherche valeur maximale entre deux champs
    Par maysa dans le forum Langage SQL
    Réponses: 6
    Dernier message: 25/05/2005, 09h40
  5. [Math] Générer un BigInteger aléatoire entre 2 bornes
    Par falcon dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 13/05/2005, 15h33

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