Fonction random

Bonjour,

après plusieurs recherche sur le sujet, j'en suis arrivé a un petit problème:

j'ai bien une fonction random qui fonctionne:

int l;
int min=0;
int max=3;
srand(time(NULL));
l = (min + ((float) rand() / RAND_MAX * (max - min + 1)));

cependant, si je la met dans une boucle for:

int l;
int min=0;
int max=3;
int i;
for(i=0;i<10;i++)
{
srand(time(NULL));
l = (min + ((float) rand() / RAND_MAX * (max - min + 1)));
}

les 10 randoms qu'elle me sortira seront identiques
d'après mes infos, ce serait parce tout les randoms se font en même temps
du coup et il possible de modifier le srand(time(NULL)) a chaque passage dans la boucle ? si oui comment ?

Merci d'avance !
Configuration: Windows XP
Firefox 3.5.5

4 réponses

  • Votes
  • Date
  • Date décroissante
  1. pour le random il faut utiliser % pas / voici un exemple
    
    #include <stdio.h>
    #include <time.h>
    
    int main(int argc, char *argv[])
    {
    int l;
    
    srand (time (NULL));
    l=(rand()%5);
    
    printf("%d",l);
    
    getchar();
    return 0;
    }
    
    }
    
    1. mais non ! il faut bien diviser par RAND_MAX pour avoir un nombre entre 0 et RAND_MAX . faire modulo marche... pour autant que tu fais modulo un nombre plus petit que RAND_MAX, ce qui n'est pas garanti.
    2. Contributeur
      Pour le random il faut utiliser % pas / voici un exemple
      C'est le contraire. Le modulo fonctionne mais ne respecte pas l'équiprobabilité puisque se bas sur les bits faibles.
  2. oui j'ai aussi essayé cette fonction qui marche mais le probleme reste le meme:

    int i,l;
    int main()
    {
    for(i=0;i<10;i++)
    {
    srand(time(NULL));
    l = rand()%2;
    printf("%d",alea);
    }
    }

    les 10 random sont identiques ...
    1. tu doit faire srand(time(NULL)); on dort de la boucle je sait pas vraiment pourquoi :(

      #include <stdio.h>
      #include <time.h>

      srand(time(NULL));
      for(i=0;i<10;i++)
      {
      l = rand()%2;
      printf("%d",l);
      }
  3. a oui effectivement ....
    je demanderait a mes profs pourquoi .... interressant ... merci de t'être posé la question et d'avoir résolu mon problème !
    1. sa te dérange si tu poste la réponse des prof :) sa sera sympa en plus peut tu change le statut du poste
    2. Contributeur
      La réponse est très simple.
      srand() est un générateur de nombres pseudo-aléatoires. On met le seed en argument et on obtiendra via rand les différents nombres du générateur qui respecte l'équiprobabilité entre 0 et RAND_MAX. Si tu refais à chaque boucle srand, tu utiliseras un autre générateur ce qui ne te donnera aucune garantie. De plus la boucle est tellement rapide que time(NULL) te donnera la même valeur et donc la graine n'aura pas changé.
      Il faut retenir qu'on initialise qu'une et une seule fois le générateur.

      Cdlt
  4. ok Merci pour l'info; je repasserai surement sur le forum : Bubble en cours de cour de programmation ! ^^
    1. héhé Bubble... Ce sera je pense ton premier exemple de très très mauvais algorithme, à ne jamais utiliser en pratique :)