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

batmat Messages postés 1871 Date d'inscription   Statut Membre Dernière intervention   -  
 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 ?
A voir également:

4 réponses

grand_guerrier Messages postés 6 Date d'inscription   Statut Membre Dernière intervention  
 
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
sebsauvage
 
Et pourquoi pas seeder avec le pid ?
0
grand_guerrier Messages postés 6 Date d'inscription   Statut Membre Dernière intervention  
 
avec wait ou select ca marche tres bien,mais je ne sais pas ce que c seeder?
0
batmat Messages postés 1871 Date d'inscription   Statut Membre Dernière intervention   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
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
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
batmat Messages postés 1871 Date d'inscription   Statut Membre Dernière intervention   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
jojo > batmat Messages postés 1871 Date d'inscription   Statut Membre Dernière intervention  
 
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