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 aleatoire entre un intervalle a et b


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 123
    Par défaut nombre aleatoire entre un intervalle a et b
    bonjour,

    voila je dois faire une fonction qui imprime au hazard des chaines de caracteres passes en arguement a la fonction du style:

    ./a.out un deux trois quatre
    deux
    un
    quatre
    trois

    seul probleme, je n'arrive pas a generer un nombre entre un intervalle a et b,
    pouvez m'aider a etablir un code le plus simple possible pour m'aider a la comprehension a de la fonction rand().

    merci !

  2. #2
    Membre éclairé
    Avatar de JMLLB
    Inscrit en
    Septembre 2006
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 285
    Par défaut
    Je n'ai pas trop compris ce que tu voulais faire mais pour ce qui est de "tirer" un chiffre entre a et b:

    http://www.developpez.net/forums/sho...php?t=239139#3

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    Salut ou ceci pour tirer un nombre entre 0 et N. pour a et b, tu fais une petite bijection [0, N] dans [a, b].

    http://c.developpez.com/faq/c/?page=..._random_bornes

  4. #4
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Pour générer entre a et b, de mémoire, on peut faire
    int val = a + (int) (((double) rand() / (double) RAND_MAX) * (b-a));

    A voir s'il n'y a pas une parenthèses en trop ou mal placée.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  5. #5
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 123
    Par défaut ok
    apres avoir lu vos reponses j'ai optez pour lle code le plus simple , en voici l'extrait:

    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
    19
    20
     
    int	random(int ac)
    {
      int	a;
      int	b;
      int	i;
      int	*res;
     
      res = malloc(sizeof (int) * 100);
      srand(time(NULL)); 
      b = 1;
      i = 0;
      while (b < ac)
        {
          res[i] = (ac * rand()) / (RAND_MAX + 1);
          i++;
          b++;
        }
      return(res);
    }
    erreur apparu:

    make
    gcc -O2 -c rand_arg.c
    rand_arg.c:16: error: conflicting types for `random'
    /usr/include/stdlib.h:176: error: previous declaration of `random'
    rand_arg.c: In function `random':
    rand_arg.c:28: warning: integer overflow in expression
    rand_arg.c:32: warning: return makes integer from pointer without a cast
    rand_arg.c: In function `print_rand':
    rand_arg.c:41: warning: assignment makes pointer from integer without a cast
    *** Error code 1

    Stop.

  6. #6
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Tu vas avoir des surprises si tu ne castes pas tes nombres en double !
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  7. #7
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 123
    Par défaut ok
    ok, je vient de changer le code, des erreurs apparaissent encore :
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <time.h>
     
    int	print_rand(int ac, char **av);
     
    int	random(int ac)
    {
      int	a;
      int	b;
      int	i;
      int	*res;
     
      res = malloc(sizeof (int) * 100);
      srand(time(NULL)); 
      b = 1;
      i = 0;
      while (b < ac)
        {
          res[i] = ac + (int) ((double) rand() / (RAND_MAX+1.0) * (b-a+1));
          b++;
        }
      return(res);
    }
     
    int	print_rand(int ac, char **av)
    {
      int	i;
      int	*res;
     
      i = 0;
      res = random(ac);
      while (ac != 1)
        {
          i = res[i];
          my_putstr(av[i]);
          my_putchar('\n');
          i++;
          ac--;
        }
    }
     
    int	main(int ac, char **av)
    {
      if (ac <= 1)
        my_putchar('\n');
      else
        print_rand(ac, av);
    }
    make
    gcc -O2 -c rand_arg.c
    rand_arg.c:18: error: conflicting types for `random'
    /usr/include/stdlib.h:176: error: previous declaration of `random'
    rand_arg.c: In function `random':
    rand_arg.c:33: warning: return makes integer from pointer without a cast
    rand_arg.c: In function `print_rand':
    rand_arg.c:42: warning: assignment makes pointer from integer without a cast
    *** Error code 1

    Stop.

    erreurs apparues:

  8. #8
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Trap D
    Pour générer entre a et b, de mémoire, on peut faire
    int val = a + (int) (((double) rand() / (double) RAND_MAX) * (b-a));
    Si b est inclu, b est tire trop peu souvent, si b est exclu, b est tire trop souvent. Pour b inclu dans l'intervalle, au minimum il faut faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int val = a + (int) ((double) rand() / (RAND_MAX+1.0) * (b-a+1));
    ou, mieux, prendre le code de la FAQ et l'adapter pour etre entre a et b plutot que 0 et n.

  9. #9
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    Si b est inclu, b est tire trop peu souvent, si b est exclu, b est tire trop souvent. Pour b inclu dans l'intervalle, au minimum il faut faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int val = a + (int) ((double) rand() / (RAND_MAX+1.0) * (b-a+1));
    ou, mieux, prendre le code de la FAQ et l'adapter pour etre entre a et b plutot que 0 et n.
    Merci des précisions, j'ai regardé ton article sur la FAQ, j'avoue ne pas avoir compris toutes les subtilités, en particulier ceci :
    int partSize = (n == RAND_MAX) ? 1 : 1 + (RAND_MAX - n)/(n+1);
    int maxUsefull = partSize * n + (partSize-1);
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  10. #10
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Trap D
    Merci des précisions, j'ai regardé ton article sur la FAQ, j'avoue ne pas avoir compris toutes les subtilités, en particulier ceci :
    Il y a un lien vers un document qui explique ceci en detail. L'objectif est d'eviter les overflows.

Discussions similaires

  1. Probleme intervalle nombres aleatoires
    Par Oasis-fruité dans le forum Débuter
    Réponses: 3
    Dernier message: 11/02/2013, 18h00
  2. Nombre aléatoire compris entre deux bornes
    Par kokosnuss dans le forum Pascal
    Réponses: 2
    Dernier message: 03/12/2006, 23h07
  3. nombres aleatoires en plsql
    Par al85 dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 29/03/2005, 19h07
  4. 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
  5. nombre aleatoire
    Par Bob dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 17/06/2002, 18h12

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