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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau 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
    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 expérimenté
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    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

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

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    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;

  4. #4
    Membre émérite
    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 : 55
    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
    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 ;
    }

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

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    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 ?

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

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    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...

  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 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....

  8. #8
    Membre expérimenté
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Par défaut

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

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 100
    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

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

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    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.

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

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    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 ?)

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

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    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à...

  13. #13
    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 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').


+ 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