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