|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 | ||
|
Membre éprouvé
![]() PIERRE-LUC REAUDprogrammateur ( programmeur amateur ;) Inscription : septembre 2010 Messages : 231 ![]() |
Bonjour,
Dans certaines circonstances particulières j'ai décelé un bug (?) de la fonction Random() de Delphi 7 et Delphi 2010. Je vous donne ci-dessous un bout de code qui met ce bug en évidence. J'aimerais savoir si ce bug a déjà été signalé et s'il existe aussi sur les dernières versions de Delphi, et pourquoi pas pour d'autres langages. Existent-il des solutions, selon vous ? Pour cela, ce serait sympa que ceux qui disposent d'autres versions essaient de le reproduire et nous retournent l'information. LE BUG : Dans certains cas, le générateur de nombres pseudo-aléatoires semble "éviter" certaines valeurs. Cela semble se produire dans des suites d'appels de Random régulières et bien particulières. CE QUE FAIT LE BENCHMARK A TESTER : Le test consiste à "tirer" aléatoirement sur la surface d'un Bitmap avec deux méthodes différentes. La première méthode est classique et consiste à tirer un pixel aléatoire sur toute la surface. La deuxième méthode est destinée à réduire la discrépance des nombres pseudo-aléatoire (la dicrépance mesure de combien un ensemble de points s'écarte d'une distribution spaciale uniforme). Elle consiste à diviser la surface du Bitmap en plus petits carrés réguliers de 4x4 pixels et a "tirer" au hasard dans chaque petit carré. C'est dans ce cas que le bug se produit. En effet, après un nombre important de "tirs" (environ 200 salves), les 2 images devraient devenir complétement noires. Or ce n'est pas le cas pour l'une d'elles. Bizarrement, ce bug ne se produit que pour certaines dimensions de Bitmap (256x256 et 512x512 par exemple, mais pas pour 128x128 ou 240x240 pixels. Il se produit aussi pour des petits carrés de 2x2 ou 8x8 pixels). Dans cet exemple, on arrive à éviter ce bug en effectuant un appel bidon à Random() de temps en temps, mais dans d'autres cas, comment savoir si le bug est présent ou non ? Pour Info, cette technique de faible discrépance alliée à la méthode de Monte Carlo est utilisée dans certains calculs de produits financiers exotique (titrisation) comme ceux à l'origine de la crise des subprimes survenue en 2007. Mais qu'on se rassure, l'origine de la crise n'est pas là ! Le test est très facile a réaliser. 2 TImages AutoSize à true, 1 TButton et un TEdit sur une fiche : Code :
|
||
|
|
00
|
|
|
#2 | ||
|
Expert Confirmé Sénior
![]() ![]() Paul TOTHFreelance Inscription : novembre 2002 Messages : 3 411 ![]() |
Bonjour,
ce n'est pas tout à fait surprenant, la fonction Random de Delphi est assez basique, il te faut utiliser un autre générateur de nombres aléatoires si tu veux quelque chose d'efficace. Je ne pense pas que la fonction ait changé entre D6 et XE2, tu retrouveras donc exactement le même comportement avec la même graine (RandSeed), le calcul est très simple, j'ai du retrouver le calcul pour TPW 1.5 sur un projet porté sous Delphi car il y a eu un petit changement depuis Code :
__________________
Developpez.com: Mes articles Entreprise: Execute SARL Produits : UPnP, RemoteOffice sous Delphi Embarcadero : Ile de la Réunion, Dephi, C++Builder, RADPHP...TVA à 8,5% |
||
|
00
|
|
|
#3 |
|
Membre Expert
![]() Yves LemaireProgr(amateur) Inscription : mars 2005 Messages : 1 162 ![]() |
Je te conseille la lecture de cet excellent article : http://www.alrj.org/docs/algo/random.php et voici une autre piste de générateur à tester : http://www.phidels.com/php/forum/for...st&postid=1820 (seul le lien sur Files Save fonctionne encore)
__________________
Delphi 5 Pro / Win 98 PE - Lazarus 0.9.30 / FPC 2.4.2 / Win 7 - Lazarus 0.9.28 / Ubuntu 11.04 |
|
|
00
|
|
|
#4 |
|
Expert Confirmé Sénior
![]() Développeur C++\Delphi Inscription : juillet 2006 Messages : 7 832 ![]() |
A la limite, utilise plutôt la fonction RandomFrom qui tire au sort un élément dans un tableau lui même ayant été généré par un Random au départ !
sinon, pense que Random(X) c'est Random() * X, donc une multiplication d'un Extended par un facteur, il est possible que la nature même de l'Extended et la gestion de l'arrondi oriente la résultat vers telle ou telle valeur ! @Paul TOTH, à la lecture de ta version TPW, il semble que celle de Delphi soit plus basique !
__________________
Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y ! Attention Troll Méchant ! ![]() "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer ! L'ignorance n'excuse pas la médiocrité ! L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde) Il faut avoir le courage de se tromper et d'apprendre de ses erreurs Parisien ! Dites NON à la VO ST au Cinéma ! Soit VF Soit VO sans sous-titre |
|
|
00
|
|
|
#5 |
|
Membre Expert
![]() Inscription : octobre 2002 Messages : 1 474 ![]() |
Une bonne discussion sut Stackoverflow.
|
|
|
00
|
|
|
#6 |
|
Expert Confirmé Sénior
![]() ![]() Paul TOTHFreelance Inscription : novembre 2002 Messages : 3 411 ![]() |
__________________
Developpez.com: Mes articles Entreprise: Execute SARL Produits : UPnP, RemoteOffice sous Delphi Embarcadero : Ile de la Réunion, Dephi, C++Builder, RADPHP...TVA à 8,5% |
|
00
|
|
|
#7 | |
|
Membre éprouvé
![]() PIERRE-LUC REAUDprogrammateur ( programmeur amateur ;) Inscription : septembre 2010 Messages : 231 ![]() |
Merci à tous pour vos contributions.
![]() J'ai découvert tout un monde, là... Bon ! Résultat des courses : Comme je n'ai pas le niveau pour choisir un algo de générateur plutôt qu'un autre et encore moins pour en coder un, je vais retenir le système de tableau + RandomFrom que propose Shai ou celui du lien de Tourlourou : Citation:
Bien que rien ne garantisse sa totale efficacité, la probabilité de faire pire que mieux est très faible, il me semble... Ce qui décidera de la méthode seront les performances sur un algo donné, je pense. Encore merci ! PS : Et pour les sceptiques incurables, il y a toujours cette possibilité. PPS : A quand un petit composant "hard" sur les cartes-mères renvoyant un vrai Random ? Son brevet vaudra de l'or, non ? |
|
|
|
00
|
|
|
#8 |
|
Expert Confirmé Sénior
![]() ![]() Paul TOTHFreelance Inscription : novembre 2002 Messages : 3 411 ![]() |
pour avoir du Random plus efficace tu peux aussi intégrer la position de la souris dans tes calculs, car ça c'est une donnée qui a peu de chance d'être cyclique
__________________
Developpez.com: Mes articles Entreprise: Execute SARL Produits : UPnP, RemoteOffice sous Delphi Embarcadero : Ile de la Réunion, Dephi, C++Builder, RADPHP...TVA à 8,5% |
|
00
|
|
|
#9 | |
|
Membre éprouvé
![]() PIERRE-LUC REAUDprogrammateur ( programmeur amateur ;) Inscription : septembre 2010 Messages : 231 ![]() |
Citation:
2) Mais les machines effectuant des calculs financiers ou scientifiques à base de nombres aléatoires ne disposent pas souvent de souris. 3) On ne dort jamais à La Réunion ?
|
|
|
|
00
|
|
|
#10 | |
|
Membre Expert
![]() Inscription : juillet 2006 Messages : 1 677 ![]() |
Bonsoir,
Je ne comprends rien à toutes ces subtilités mathématiques mais ce matin, j'avais 5 minutes au taf, et Lazarus (0.9.30), alors je me suis dit « testons ! » Citation:
Valà,
__________________
On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère. Mes 2 cts, -- jp |
|
|
|
00
|
|
|
#11 |
|
Membre éprouvé
![]() PIERRE-LUC REAUDprogrammateur ( programmeur amateur ;) Inscription : septembre 2010 Messages : 231 ![]() |
Merci Jipété.
Ce sera répété et amplifié à Thierry Laborde. |
|
|
00
|
|
|
#12 | |
|
Membre émérite
![]() Inscription : juillet 2004 Messages : 710 ![]() |
Citation:
J'ai jamais testé, c'est juste une idée comme ça. Et je n'ai pas breveté l'idée, on va dire que c'est dans le domaine public.
__________________
Sondages gratuits : Le troc d'opinions |
|
|
|
00
|
|
|
#13 |
|
Membre Expert
![]() ![]() Étudiant Inscription : juin 2009 Messages : 902 ![]() |
Mmhh non je pense pas, tu aurais un lien avec la fréquence de rotation du ventilateur ^^
__________________
Articles : Création d'un système de chat en PascalProgrammes : Défi Pascal 2011 - Mon Tetris Défi Pascal 2010 - Mon système de chat Défi Delphi 2009 - Mon Sudoku SolverRetrouvez mes différents projets sur ma page personnelle. |
|
|
00
|
|
|
#14 |
|
Expert Confirmé Sénior
![]() Développeur C++\Delphi Inscription : juillet 2006 Messages : 7 832 ![]() |
Pourquoi vouloir enregistrer le ventilateur, il est bien connu que Silence génère déjà un bruit du signal, c'est bien suffisant non ?
Sinon, mettre une caméra filmant la neige d'un tube cathodique Mince cela déjà été inventé avec des Lampas à Lave des années 70 10 GOTO 10, il y a d'autres farfelues avant nous qui y avait déjà pensé ! Tout les vrais systèmes de random utilise un bruit basé sur un ou plusieurs phénomènes naturelles ! Sérieusement, je ne crois avoir jamais utilisé un Random dans une application professionnelle, juste pour des essais ! Windows ne fournit-il pas un générateur aléatoire pour le Chiffrage ? Voir RtlGenRandom, CryptGenRandom ... peut-être que cela permet d'obtenir des nombres aléatoires plus fiables ! J'ignore par contre comme utiliser cela pour gérer de petits nombres, en crypto, j'ai utilisé ça pour générer des clés de 128Bits !
__________________
Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y ! Attention Troll Méchant ! ![]() "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer ! L'ignorance n'excuse pas la médiocrité ! L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde) Il faut avoir le courage de se tromper et d'apprendre de ses erreurs Parisien ! Dites NON à la VO ST au Cinéma ! Soit VF Soit VO sans sous-titre |
|
|
00
|
|
|
#15 | |
|
Membre éprouvé
![]() PIERRE-LUC REAUDprogrammateur ( programmeur amateur ;) Inscription : septembre 2010 Messages : 231 ![]() |
Citation:
Je rappelle que, dans le droit français, pour qu'une idée soit brevetable, elle ne doit pas avoir été divulguée avant le dépôt du brevet. - Le défi serait donc de créer un mouvement quelconque qui soit chaotique... - Et le double pendule en est capable dans certains cas ! --> Voir cet article. Ca y est ! Ce n'est plus brevetable !
|
|
|
|
00
|
|
|
#16 | |
![]() ![]() Inscription : septembre 2008 Messages : 2 233 ![]() |
Citation:
Mais où le bas blesse est : Premièrement, une idée est de toute façon protégée par le droit intellectuel. Ca devrait suffire à certaines compensations. Deuxièmement: Je trouve inadmisible qu'on puisse protéger quelque chose qu'on est incapable de mettre en oeuvre, voir qui est infaisable au moment du dépôt (qui relève de la fiction). A titre d'exemple, j'ai un gars qui me demandait de prévoir certains développements en multi-touch (brevetés) parce que Windows 7 était annoncé prochainement... ![]() Troisièmement: en pensant que les brevêts sont par pays et en suivant ton raisonnement, quelque chose qui n'a pas été breveté en premier lieu en France... ne peut plus l'être |
|
|
|
00
|
|
|
#17 |
|
Membre éprouvé
![]() PIERRE-LUC REAUDprogrammateur ( programmeur amateur ;) Inscription : septembre 2010 Messages : 231 ![]() |
Tu as raison, je me suis mal exprimé en parlant d'«idée».
En fait, n'est brevetable en France qu'une solution technique à un problème technique. Mais cela correspond tout à fait au générateur de nombres aléatoires. Ce qui peut être breveté Ce qui ne peut pas être breveté Les 16 étapes clés du dépôt de brevet d'invention |
|
|
00
|
|
|
#18 |
|
Membre chevronné
![]() Inscription : avril 2008 Messages : 762 ![]() |
Si j'ai compris bien
Récupérer le pois faible retourné par le compteur de cycls cpu avec QueryPerformanceCounter pourrai être utiles. |
|
|
00
|
|
|
#19 | ||||
|
Membre du Club
![]() Inscription : mars 2009 Messages : 48 ![]() |
Bonjour, comme la question a été posée plus haut :
Pour votre information, voici comment fonctionne le générateur d'entiers pseudo-aléatoires de Delphi 5 et 7: I / Appel de Randomize : Code :
II / L'appel de Random(Range) aboutit à cette toute petite routine : en entrée EAX contient le domaine de "pêche" et aura le nombre pseudo-aléatoire généré en sortie : Code :
Voici ce qu'elle fait : 1/ elle multiplie La variable RandSeed par la valeur $08088405 = 134 775 813 dans le registre EDX ce qui veut dire que le résultat est modulo 32 bits. (Randseed * 134775813) mod 2^32 2/ le résultat est incrémenté : (RandSeed * 134775813) mod 2^32 + 1 3/ cette valeur obtenue est rangée dans la variable RandSeed (pour le prochain tirage ?) 4/ elle multiplie Range par cette valeur et obtient un Int64 qui vaut Range * [(RandSeed * 134775813) mod 2^32 + 1] 5/ et elle ne renvoie que la partie haute, ce qui revient à diviser par 2^32 [Range*[(RandSeed*134775813) mod 2^32 +1] div 2^32 |
||||
|
|
00
|
|
|
#20 | ||
|
Membre chevronné
![]() Inscription : avril 2008 Messages : 762 ![]() |
j'aimerai bein que quelqu'un teste pour moi le code suivant ... pc grillé .
Code :
|
||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com