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

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. 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
    1. Et pourquoi pas seeder avec le pid ?
      1. avec wait ou select ca marche tres bien,mais je ne sais pas ce que c seeder?
      2. 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 ?
    2. 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.
      1. 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.
        1. 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 ?
        2. @batmattu 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