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 :

nombre aléatoire positif et négatif


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 6
    Points : 5
    Points
    5
    Par défaut nombre aléatoire positif et négatif
    Bonjour,

    je recherche une fonction qui me permetrais de générer des nombres à la fois positif et negatif. Je sais que rand peut etre utilisé pour des nombres allant de 0 à N mais ce qu'il me faudrait c'est deux limites. un nombre pourait etre comprit, par exemple entre -34 et 56. Vous avez une idée?

    merci

  2. #2
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Points : 354
    Points
    354
    Par défaut
    tu pourrai utiliser un tableau contenant 2 valeurs: 1(i=0) et -1(i=1) par ex.
    et utiliser un rand sur i(de 0 à 1) multiplié par un autre rand de 0 à N....

    y'a surement d'autres solutions, mais je les connais po...

    ps: avec ma methode ton nombre sera compris entre -N et N
    __________
    "Any sufficiently advanced technology is indistinguishable from magic" Arthur C. Clarke

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Points : 711
    Points
    711
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int delta = max - min + 1;
    int v = rand(delta);
    v = v + min;
    Compilation sans erreur ne signifie pas programme sans erreur.
    L'indentation n'a pas été imaginée pour faire beau, mais pour faciliter la lecture des programmes.

  4. #4
    Membre éclairé
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Points : 742
    Points
    742
    Par défaut
    Salut,

    Comme les autres je te propose une solution
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
     
    int valeur = 0 ;
     
    int main(int argc, char *argv[])
    { int i ;
     
      srand(time(NULL)) ;   // Initialise le générateur de nombres pseudo-aléatoires
      for(i=0; i<25; i++)
      {
        valeur = (91*rand())/(RAND_MAX+1) ;  // Tirer un nombre aléatoire entre 0 et 91
        valeur -= 34 ;                       // Point milieu
        printf("Nombre entre -34 et +56 = %d\n", valeur) ;
      }
      return 0 ;
    }
    - Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !
    - Travailler dur n'a jamais tué personne, mais pourquoi prendre le risque (Edgar Bergen)

  5. #5
    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 isatis28
    je recherche une fonction qui me permetrais de générer des nombres à la fois positif et negatif. Je sais que rand peut etre utilisé pour des nombres allant de 0 à N mais ce qu'il me faudrait c'est deux limites. un nombre pourait etre comprit, par exemple entre -34 et 56. Vous avez une idée?
    Super dur : utilise un offset. C'est des maths, niveau Mat. Sup. 'Maternelle Supérieure').

    Pas de Wi-Fi à la maison : CPL

  6. #6
    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 kamouminator
    tu pourrai utiliser un tableau contenant 2 valeurs: 1(i=0) et -1(i=1) par ex.
    et utiliser un rand sur i(de 0 à 1) multiplié par un autre rand de 0 à N....
    Pas de Wi-Fi à la maison : CPL

  7. #7
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Points : 354
    Points
    354
    Par défaut
    __________
    "Any sufficiently advanced technology is indistinguishable from magic" Arthur C. Clarke

  8. #8
    Membre confirmé Avatar de Flow_75
    Femme Profil pro
    Ingénieure
    Inscrit en
    Mai 2005
    Messages
    1 096
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieure
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 096
    Points : 633
    Points
    633
    Par défaut
    Citation Envoyé par kamouminator
    tu pourrai utiliser un tableau contenant 2 valeurs: 1(i=0) et -1(i=1) par ex.
    et utiliser un rand sur i(de 0 à 1) multiplié par un autre rand de 0 à N....

    y'a surement d'autres solutions, mais je les connais po...

    ps: avec ma methode ton nombre sera compris entre -N et N
    +1
    un pour l'amplitude et un pour le signe me parait une bonne solution
    Tu as une bonne maitrise de l'amplitude avec une variable claire

  9. #9
    Membre éprouvé Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Points : 1 260
    Points
    1 260
    Par défaut
    Citation Envoyé par Flob91
    un pour l'amplitude et un pour le signe me parait une bonne solution
    Tu as une bonne maitrise de l'amplitude avec une variable claire
    A choisir, je préfère la solution d'Elijha.
    [alkama] quelqu'un est allé voir la guerre des mondes?
    [@Chrisman] j'espère pour spielberg
    --- bashfr.org

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Points : 711
    Points
    711
    Par défaut
    Bonjour,
    Citation Envoyé par zooro
    A choisir, je préfère la solution d'Elijha.
    Pourquoi se forcer à passer un réel, etc...

    Un simple offset comme je l'ai proposé, et qu'Emmanuel a rappelé

    (Autre défaut de la solution d'Elijha : pourquoi utiliser une variable globale, absolument injustifiée ici ?)
    Compilation sans erreur ne signifie pas programme sans erreur.
    L'indentation n'a pas été imaginée pour faire beau, mais pour faciliter la lecture des programmes.

  11. #11
    Membre éprouvé Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Points : 1 260
    Points
    1 260
    Par défaut
    Citation Envoyé par thewho
    Pourquoi se forcer à passer un réel, etc...
    Un simple offset comme je l'ai proposé, et qu'Emmanuel a rappelé
    (Autre défaut de la solution d'Elijha : pourquoi utiliser une variable globale, absolument injustifiée ici ?)
    Pour la variable globale, on est d'accord, elle n'est pas utile ici.
    Mais je n'ai pas vu de réel, etc.
    Et déplacer la plage résultat n'est-ce pas utiliser un offset ? Ou alors je n'ai pas compris ce que vous entendiez par là...
    [alkama] quelqu'un est allé voir la guerre des mondes?
    [@Chrisman] j'espère pour spielberg
    --- bashfr.org

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Points : 711
    Points
    711
    Par défaut
    Bonjour,
    Citation Envoyé par Elijha
    Salut,

    Comme les autres je te propose une solution
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
     
    int valeur = 0 ;
     
    int main(int argc, char *argv[])
    { int i ;
     
      srand(time(NULL)) ;   // Initialise le générateur de nombres pseudo-aléatoires
      for(i=0; i<25; i++)
      {
        valeur = (91*rand())/(RAND_MAX+1) ;  // Tirer un nombre aléatoire entre 0 et 91
        valeur -= 34 ;                       // Point milieu
        printf("Nombre entre -34 et +56 = %d\n", valeur) ;
      }
      return 0 ;
    }
    Oui, au temps pour, il n'y a pas de réel dans la solution d'Elijha, j'avais lu un peu vite,

    MAIS
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        valeur = (91*rand())/(RAND_MAX+1) ;  // Tirer un nombre aléatoire entre 0 et 91
    je ne pense pas que ce soit une solution pour avoir un rand de 0 à 91 : la bonne manière est
    Celle proposée par Elijha pose/posera des problèmes: le calcul
    peut entraîner un overflow : ça dépend de l'implémentation, de la valeur de RAND_MAX, de la taille d'un entier... donc peut-être ok avec un compilateur, pas avec une autre, etc...

    Et quoi qu'il en soit, pour aller faire ce calcul, mutiplication suivie par une division, alors que rand(int) fait parfaitement bien son travail ?
    Compilation sans erreur ne signifie pas programme sans erreur.
    L'indentation n'a pas été imaginée pour faire beau, mais pour faciliter la lecture des programmes.

  13. #13
    Membre éprouvé Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Points : 1 260
    Points
    1 260
    Par défaut
    Citation Envoyé par thewho
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        valeur = (91*rand())/(RAND_MAX+1) ;  // Tirer un nombre aléatoire entre 0 et 91
    je ne pense pas que ce soit une solution pour avoir un rand de 0 à 91 : la bonne manière est
    D'après le man de rand() :
    et
    Si vous désirez engendrer un entier aléatoire entre 1 et 10, vous devez toujours procéder en utilisant les bits de poids forts, comme dans :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    j=1+(int) (10.0*rand()/(RAND_MAX+1.0));
    Donc...
    [alkama] quelqu'un est allé voir la guerre des mondes?
    [@Chrisman] j'espère pour spielberg
    --- bashfr.org

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Points : 711
    Points
    711
    Par défaut
    Bonjour,

    Ce n'est pas ce que Elijha fait dans sa réponse.

    Ici, ça passe effectivement pas des réels, je connais cette page du man, d'où ma lecture "un peu rapide", j'avais conclu à cette utilisation intermédiaire de réels.

    Elijha fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    valeur = (91*rand())/(RAND_MAX+1) ;  // Tirer un nombre aléatoire entre 0 et 91
    Ce qui n'est pas la même chose que ce que dit le man : les calculs avec des entiers ne donnent pas forcément le même résultat qu'avec des réels, même si on ne tient pas compte des erreurs dues à la précision des réels: j'y reviens, selon la valeur des RAND_MAX et la taille d'un entier, la multiplication [b]91*rand() peut entraîner un overflow.

    Donc, utilise ce que dit le man, mais utilise ce que dit effectivement le man.
    Compilation sans erreur ne signifie pas programme sans erreur.
    L'indentation n'a pas été imaginée pour faire beau, mais pour faciliter la lecture des programmes.

  15. #15
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par thewho
    Donc, utilise ce que dit le man, mais utilise ce que dit effectivement le man.
    Je conseille d'utiliser ce que dit la FAQ
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  16. #16
    Membre éclairé
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Points : 742
    Points
    742
    Par défaut
    Salut,

    Pour calmer les esprits, je peu corriger les lignes suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    valeur = (int)((91*rand())/(RAND_MAX+1)) ;
    valeur -= 34 ;
    Comme ça pas d'overflow .
    (Autre défaut de la solution d'Elijha : pourquoi utiliser une variable globale, absolument injustifiée ici ?)
    Pourquoi "injustifiée", et si j'en ai envie; sinon je ne vois pas trop le rapport avec le problème.

    Nota : le programme n'était qu'à titre d'exemple, après isatis28 peu en faire ce qu'il en veut
    - Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !
    - Travailler dur n'a jamais tué personne, mais pourquoi prendre le risque (Edgar Bergen)

  17. #17
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Points : 711
    Points
    711
    Par défaut
    Bonjour,
    Citation Envoyé par Elijha
    Pour calmer les esprits, je peu corriger les lignes suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    valeur = (int)((91*rand())/(RAND_MAX+1)) ;
    valeur -= 34 ;
    Comme ça pas d'overflow
    Ton nouveau code ne supprime pas la partie qui peut engendre un overflow:
    multiplication qui est faite avant la division.
    En fait, si tu as un peu suivi, le calcul est bon, SAUF qu'il faut le faire en réel, et ne repasser en entier qu'après.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    valeur = (int)(91.0*rand()/(RAND_MAX+1.0));
    Citation Envoyé par Elijha
    Pourquoi "injustifiée", et si j'en ai envie; sinon je ne vois pas trop le rapport avec le problème.
    Parce que l'utilisation de variables globales et très fortement déconseillée, sauf ne pouvoir faire autrement, ce n'est pas "une question d'envie" ou pas, mais une manière de programmer proprement.
    Compilation sans erreur ne signifie pas programme sans erreur.
    L'indentation n'a pas été imaginée pour faire beau, mais pour faciliter la lecture des programmes.

  18. #18
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Elijha
    Pour calmer les esprits, je peu corriger les lignes suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    valeur = (int)((91*rand())/(RAND_MAX+1)) ;
    Tu n'as rien changé... il y a toujours deux sources d'overflow: 91*rand() et RAND_MAX+1 (RAND_MAX peut valoir MAX_INT).
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  19. #19
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    je pensez pas avoir autant de reponse! Il est vrai que la solutiion de thewho est la plus simple, mais celle Elijha marche aussi. Merci beaucoup de votre aide!

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

Discussions similaires

  1. [Free Pascal] Produit de trois nombres positifs ou négatifs
    Par nadirmabed dans le forum Free Pascal
    Réponses: 17
    Dernier message: 18/01/2015, 08h38
  2. [Turbo Pascal] Tri de nombres positifs et négatifs
    Par khmamed dans le forum Turbo Pascal
    Réponses: 4
    Dernier message: 06/03/2011, 17h40
  3. recherche algo de génération de nombre aléatoire
    Par Pascale38 dans le forum MFC
    Réponses: 2
    Dernier message: 26/01/2004, 14h20
  4. Nombre aléatoire en SQL
    Par sqlnet dans le forum Langage SQL
    Réponses: 8
    Dernier message: 19/08/2003, 12h38
  5. Générer un nombre aléatoire entre 0 et 1 (INCLUS !!!)
    Par haypo dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 22/08/2002, 16h30

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