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ération nombre aléatoire float


Sujet :

C

  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mars 2017
    Messages : 93
    Par défaut Génération nombre aléatoire float
    Bonjour,

    Je cherche à générer aléatoirement un nombre aléatoire de type float entre -1 et 1.
    J'ai la fonction suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    float random_value(){
        float r = (float)rand()/RAND_MAX;
        if (r>0.5){
            return (float)-rand()/RAND_MAX;
        }else{
            return (float)rand()/RAND_MAX;
        }
    }
    Est-ce la meilleure façon pour le faire?

    Merci

  2. #2
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 746
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 746
    Par défaut
    Une translation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    float random_value = ((rand() % 2) - 1.0f);

    Edit : Bousk a raison. mon code travaille en entier et
    Mais il faut bien faire une translation d'un intervalle. Par exemple, translater [0, 2] de -1

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 144
    Billets dans le blog
    4
    Par défaut
    rand() génère un nombre dans [0, RAND_MAX]
    donc (float)rand()/RAND_MAX sera dans [0, 1.0]
    du coup pour avoir [-1.0, 1.0] peut-être (rand() / (RAND_MAX * 0.5f)) - 1.0f
    la magie des opérations de base

    ((rand() % 2) - 1.0f);
    Hélas rand génère un int, donc ce code génèrerait uniquement -1 ou 0
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  4. #4
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mars 2017
    Messages : 93
    Par défaut
    Merci d'avoir répondu, c'est vrai que si j'avais plus réfléchi, j'aurais trouvé .

    Juste une autre petite question : que veut dire 0.5f? C'est pour forcer à convertir en float? Quelle est la différence avec (float)?

  5. #5
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 746
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 746
    Par défaut
    Il y a aussi 5000000000L (<- L, pour long int)

    Ce sont des indications pour préciser le type au compilateur (float ou long int)

    Par rapport, au cast, il ne fait pas de conversions implicites.
    De plus, ces indications ne fonctionnent qu'avec des literals
    Et enfin, avec le cast, il faut bien le positionner.

    Par exemple : float f = (float) 1 / 2; <- Est-ce que c'est 1 qui est casté (et donc résultat correct) ou le résultat (et donc division entière/ résultat incorrect)
    Bon, après test, mon gcc caste le 1

  6. #6
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 491
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 491
    Billets dans le blog
    1
    Par défaut
    Ne pas oublie qu'il y a une FAQ sur ce site et quelle peut donner des informations intéressantes (même si ici ce n'est pas tout à fait la question posée) https://c.developpez.com/faq/?page=L...l-entre-0-et-x

  7. #7
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mars 2017
    Messages : 93
    Par défaut
    Merci j'avais déjà vu ce FAQ.

    Bonne soirée !

  8. #8
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    Citation Envoyé par foetus Voir le message
    Par rapport, au cast, il ne fait pas de conversions implicites.
    http://en.cppreference.com/w/c/langu...ic_conversions

    Citation Envoyé par foetus Voir le message
    Et enfin, avec le cast, il faut bien le positionner.

    Par exemple : float f = (float) 1 / 2; <- Est-ce que c'est 1 qui est casté (et donc résultat correct) ou le résultat (et donc division entière/ résultat incorrect)
    Bon, après test, mon gcc caste le 1
    http://en.cppreference.com/w/c/langu...tor_precedence

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

Discussions similaires

  1. Génération nombres aléatoires différents
    Par delphine2202 dans le forum Fortran
    Réponses: 3
    Dernier message: 02/03/2018, 22h07
  2. Génération nombres aléatoires
    Par vincent1989 dans le forum R
    Réponses: 2
    Dernier message: 26/05/2014, 19h14
  3. [Math / Random] Génération nombre aléatoire compris entre deux bornes
    Par oligig dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 30/06/2013, 17h23
  4. Génération nombre aléatoire
    Par pixel016 dans le forum WinDev
    Réponses: 12
    Dernier message: 15/01/2011, 15h41
  5. Problème génération nombre aléatoires
    Par Pim'Ouss dans le forum Général Java
    Réponses: 3
    Dernier message: 15/10/2010, 12h25

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