PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WINDEV 2025 → fonction hasard : bug inattendu !
fonction hasard : bug inattendu !
Iniciado por christophe.pradel, 10,ene. 2019 10:14 - 6 respuestas
Publicado el 10,enero 2019 - 10:14
Bonjour,

Je viens d'expérimenter par hasard (c'est la cas de la dire) un bug sur la fonction hasard :

Lorsqu'elle est utilisée au sein d'un thread, elle renvoie toujours la même valeur !!!

Testé sous W24. Je ne sais si c'est le cas des versions précédentes

Exemple :

Initialisation de la fenêtre :
InitHasard()


Code d'une procedure locale de la fenetre
Procedure GetHasard()

Trace("Hasard 1 : " + Hasard())
Trace("Hasard 2 : " + Hasard(1000))
Trace("Hasard 3 : " + Hasard(1000, 2000))


Code d'un bouton lançant la procédure dans le thread principal :
GetHasard()


On obtient, pour trois clics :
Hasard 1 : 0.3841059602649
Hasard 2 : 280
Hasard 3 : 1761
Hasard 1 : 0.03311258278146
Hasard 2 : 906
Hasard 3 : 1204
Hasard 1 : 0.1148411511582
Hasard 2 : 803
Hasard 3 : 1466


Code d'un bouton lançant la procédure dans un thread secondaire :
ThreadExecute("TestHasard",threadNormal,GetHasard)


On obtient, pour trois clics :
Hasard 1 : 0.001159703360088
Hasard 2 : 236
Hasard 3 : 1648
Hasard 1 : 0.001159703360088
Hasard 2 : 236
Hasard 3 : 1648
Hasard 1 : 0.001159703360088
Hasard 2 : 236
Hasard 3 : 1648


Merci de me confirmer que vous constatez le même problème chez vous.

Bien sûr, il est facile de contourner ce problème, mais j'ai préféré faire ce post pour éviter à certains de perde du temps en débug avant de découvrir le pot aux roses...
Publicado el 10,enero 2019 - 10:39
Et si tu met InitHasard() dans ta procédure GetHasard() ?
Cdt
Miembro registrado
29 mensajes
Publicado el 10,enero 2019 - 10:47
Je viens de tester en 24 aussi, ça fait pareil chez moi.
Publicado el 10,enero 2019 - 11:22
En windev 20 : idem.
Mais InitHasard dans GetHasard règle le problème.
Publicado el 10,enero 2019 - 11:28
Merci pour vos réponses

Effectivement InitHasard dans le thread corrige le problème
Miembro registrado
139 mensajes
Publicado el 10,enero 2019 - 14:59
si le lancement des thread est très rapproché et que 2 thread appellent InitHasard() dans le même centième de seconde, les séquences produites par la fonction Hasard de ces deux thread seront identiques.
Miembro registrado
1.640 mensajes
Publicado el 10,enero 2019 - 15:26




Comme indiqué dans la doc, la fonction Hasard() DOIT être initialisée par InitHasard()
Et ce n'est pas une histoire de thread.

La fonction Hasard() non initialisée renverra toujours la même chose a chaque exécution du programme.