Srand(time(NULL)) => probleme de fork

batmat Messages postés 1880 Date d'inscription   Statut Membre -  
 jojo -
J'ai un probleme de graine pseudo aléatoire : lorsque je forke, les processus fils doivent attendre un certain temps, or comme ils sont forkés en meme temps, meme en commencant par srand(time(NULL)); ca génère la meme graine, donc ca m'énerve parce que les fils attendent le meme temps et ce n'est absolument pas ce que je veux !!! ;-)

Quelqu'un aurait une solution ?
------------------------
Vous hésitez entre Linux et Windows?
Vous voulez dépenser du temps ou de l'argent ?

4 réponses

  1. grand_guerrier Messages postés 6 Statut Membre
     
    il faut utiliser la fonction wait()
    ou un select avec tous les paramatres a NULL sauf le dernier ou tu mets le temps en seconde que tu veux attendre
    0
  2. sebsauvage
     
    Et pourquoi pas seeder avec le pid ?
    0
    1. grand_guerrier Messages postés 6 Statut Membre
       
      avec wait ou select ca marche tres bien,mais je ne sais pas ce que c seeder?
      0
    2. batmat Messages postés 1880 Date d'inscription   Statut Membre 114
       
      1 ) seed en anglais, ca veut dire graine,
      pour générer un nombre"pseudo-aléatoire", en général on prend la graine time(NULL) tout simplement parce qu'elle change tout le temps
      => srand(time(NULL))

      2) wait ca serait pas plutot pour attendre la mort d'un fils ? tu veux plutot dire sleep je pense ? select je ne connais pas

      @+
      -------------------
      Vous hésitez entre Linux et Windows?
      Vous voulez dépenser du temps ou de l'argent ?
      0
  3. BigBen68
     
    Tu as plusieurs fils je suppose ???
    Tu initialises le Rand, dans le code du(des) fils ou pas avant de Forker ?
    Sinon tu pourrais essayer d'initialiser ton Srand avec le PID du fils créé, ça te ferais une base pseudo-aléatoire pour ton temps...
    A essayer. Je vois rien d'autre pour l'instant mais je vais y réfléchir
    parce-que c'est effectivement un bon sujet de casse-tête.
    Ciao bon courage. BigBen.
    0
  4. sebsauvage
     
    seeder = initialiser le générateur de nombres aléatoire avec une graine (seed).

    Mais il n'y a pas un device sous Unix qui fourni des données aléatoires ? (/randpool ou quelquechose comme ça ?)

    ça serait déjà mieux que le rand() du C.
    0
    1. batmat Messages postés 1880 Date d'inscription   Statut Membre 114
       
      si : /dev/random fournit des données temps réel proche de l'idéal aléatoire : le systeme fait des prises d'états des periphériques à plusieurs instants t, un truc marrant à essayer, tu fais cat /dev/random
      c un fichier qui se génère tps réel (comme je viens de le dire :-) si tu ne touche à rien , tu vois que ca s'arrete puis que ca repart (idle se lance par exemple)
      => ce fichier est génial pour les besoins d'acces aléatoires

      un autre fichier un peu moins aléatoire est /dev/urandom il marche un peu differement, c pour le cas ou tes données aléatoires doivent arriver un peu moins de facon saccadée comme /dev/random (genre pour un jeu par exemple, les ralentissements seraient chiants ;-)

      Voila ce que je sais :-))

      Pour ceux que le pb interesse, en fait j'en ai besoin parce qu'en ce moment je programme des sémaphores et des variables partagées
      => N processus ont un RDV ... mais pour les faire démarrer dans un ordre aléatoire, et qu'ils n'attendent pas le meme temps, c la le pb :-)

      merci à tous
      @+

      Vous hésitez entre Linux et Windows?
      Vous voulez dépenser du temps ou de l'argent ?
      0
      1. jojo > batmat Messages postés 1880 Date d'inscription   Statut Membre
         
        tu repart simplement sur une nouvelle graine

        exemple : pour chaque processus srand( time ( NULL) + getpid() )

        là tu es sur d'avoir des valeur différente pour ton rand apres
        0