Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1794 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Améliorer la vitesse du fonction donnant un nombre aléatoire

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Améliorer la vitesse du fonction donnant un nombre aléatoire

n°1528415
lasvegasth​eking
Posté le 14-03-2007 à 14:55:26  profilanswer
 

Bonjour,
 
j'ai écrit cette fonction pour obtenir un nombre aléatoire entre min et max inclus.

Code :
  1. //Tirage aleatoire d'un nombre
  2. int hasard(int min, int max){
  3.   return (min + (rand() % (max - min + 1)));
  4. }


 
Cette fonction est utilisé des milliers de fois dans un programme.
Le lancement du mon programme met 17secondes pour afficher les résultats.
 
Je voudrais donc essayer d'améliorer cette fonction pour essayer de la rendre plus rapide.
 
Quelqu'un aurait-il une solution ?
 
Merci

mood
Publicité
Posté le 14-03-2007 à 14:55:26  profilanswer
 

n°1528669
el muchach​o
Comfortably Numb
Posté le 14-03-2007 à 22:10:34  profilanswer
 

A première vue, je vois deux solutions:
1. inline
2. écrire une fonction rand customisée plus rapide et qui t'évite le modulo supplémentaire (car rand fait déjà probablement un modulo, jette un oeil au code source de la fonction).
Voir Numerical Recipes pour des rand rapides et fiables.


Message édité par el muchacho le 14-03-2007 à 22:10:51
n°1528670
Joel F
Real men use unique_ptr
Posté le 14-03-2007 à 22:11:11  profilanswer
 

ou utiliser boost::randomizer avec une implantation du lagged_fibonacci ou d'un mersenne_twister.

n°1528672
el muchach​o
Comfortably Numb
Posté le 14-03-2007 à 22:12:20  profilanswer
 

C'est rapide le Mersenne twister ?

n°1528684
Ace17
Posté le 14-03-2007 à 22:44:31  profilanswer
 

Accessoirement, cette facon de tirer un nombre au hasard ne serait-elle pas un peu fausse ? (Je veux dire, pas equiprobable)

n°1528738
Joel F
Real men use unique_ptr
Posté le 15-03-2007 à 09:11:04  profilanswer
 

el muchacho a écrit :

C'est rapide le Mersenne twister ?


Assez, j'aipas les chiffres en têtes mais devrait y avoir des infos là :
http://www.math.sci.hiroshima-u.ac [...] -lang.html

n°1528791
tbp
Posté le 15-03-2007 à 10:40:59  profilanswer
 

MT fonctionne par burst (lors du remplissage du pool), ce qui peut être inacceptable.
Il y a d'autres solutions, pas forcément meilleures qualitativement ou franchement plus rapides, n'ayant pas de telles contraintes.
 
Voir par exemple George Marsaglia, "Seeds for random number generators" http://portal.acm.org/citation.cfm [...] EN=6184618
 
Numerical Recipes est à éviter de toute urgence.


Message édité par tbp le 15-03-2007 à 10:43:42
n°1529330
el muchach​o
Comfortably Numb
Posté le 16-03-2007 à 09:27:14  profilanswer
 

WTF ?

n°1529334
tbp
Posté le 16-03-2007 à 09:36:24  profilanswer
 

Mersenne twister fonctionne en rafale: les valeurs viennent d'un tampon qu'il faut remplir périodiquement. En moyenne c'est rapide, mais il y a des pointes d'activité frénétique. { jargon ftw }

Message cité 1 fois
Message édité par tbp le 16-03-2007 à 09:42:58
n°1529399
Taz
bisounours-codeur
Posté le 16-03-2007 à 11:25:46  profilanswer
 

lasvegastheking a écrit :

Bonjour,
 
j'ai écrit cette fonction pour obtenir un nombre aléatoire entre min et max inclus.

Code :
  1. //Tirage aleatoire d'un nombre
  2. int hasard(int min, int max){
  3.   return (min + (rand() % (max - min + 1)));
  4. }


 
Cette fonction est utilisé des milliers de fois dans un programme.
Le lancement du mon programme met 17secondes pour afficher les résultats.
 
Je voudrais donc essayer d'améliorer cette fonction pour essayer de la rendre plus rapide.
 
Quelqu'un aurait-il une solution ?
 
Merci

Se poser les vrais questions : si tu as besoin de faire 17s d'appels à hasard(), t'es mal barré. Avec un CPU actuel, tu dois pouvoir faire un nombre très élevé d'appel chaque seconde. Ca veut dire que rand() va wrapper plusieurs fois. Donc que tes données aléatoires sont de très mauvaises qualité.
 
Change de générateur. Prend en un meilleur et un plus rapide. Voir un bourrin read(/dev/urandom, data, n);
 
J'imagine le for (;;) data[i] = hasard(x, y);, bonjour le carton, avec n'importe quelle fonction.
 
 

mood
Publicité
Posté le 16-03-2007 à 11:25:46  profilanswer
 

n°1529852
el muchach​o
Comfortably Numb
Posté le 17-03-2007 à 08:20:54  profilanswer
 

tbp a écrit :

Mersenne twister fonctionne en rafale: les valeurs viennent d'un tampon qu'il faut remplir périodiquement. En moyenne c'est rapide, mais il y a des pointes d'activité frénétique. { jargon ftw }


J'avais pensé à bufferiser les valeurs. Mais ma question portait sur ton commentaire sur les Numerical Recipes.

n°1529883
tbp
Posté le 17-03-2007 à 12:00:50  profilanswer
 

Mille pardons.
Mon édition du Numerical Recipes in C est particulièrement poussiéreuse, mais je ne crois pas qu'ils aient récemment résolu la principale critique qu'on leur adresse: la fiabilité.

n°1529894
Sve@r
Posté le 17-03-2007 à 13:05:55  profilanswer
 

lasvegastheking a écrit :

Bonjour,
 
j'ai écrit cette fonction pour obtenir un nombre aléatoire entre min et max inclus.

Code :
  1. //Tirage aleatoire d'un nombre
  2. int hasard(int min, int max){
  3.   return (min + (rand() % (max - min + 1)));
  4. }


 
Cette fonction est utilisé des milliers de fois dans un programme.
Le lancement du mon programme met 17secondes pour afficher les résultats.
 
Je voudrais donc essayer d'améliorer cette fonction pour essayer de la rendre plus rapide.
 
Quelqu'un aurait-il une solution ?
 
Merci


 
Je ne sais pas comment améliorer la vitesse... mais en tout cas on peut améliorer la distribution aléatoire en remplaçant par

return (int)(min + (rand() / (double)RAND_MAX * (max - min + 1)));


 


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1529994
el muchach​o
Comfortably Numb
Posté le 17-03-2007 à 20:37:38  profilanswer
 

tbp a écrit :

Mille pardons.
Mon édition du Numerical Recipes in C est particulièrement poussiéreuse, mais je ne crois pas qu'ils aient récemment résolu la principale critique qu'on leur adresse: la fiabilité.


Bah, il y a eu des errata eu fur et à mesure des éditions. C'est plutôt fiable dans l'ensemble, je pense, mais c'est sûr que ce n'est pas un package boîte noire complet comme IMSL et NAG. C'est d'ailleurs l'un des principes du livre, qui est que l'utilisateur sache ce qu'il fait. Pour moi, le principal pb des NR est que ce n'est pas ce qu'il y a de plus performant ni de plus facile à utiliser, outre le fait que le code reste assez dégueu (très fortran). Mais cette critique ne s'applique pas au chapitre sur le RNG.
Les algos présentés sont quand même assez performants en moyenne, en tout cas plus que ce qu'on peut pondre soi-même dans je dirais 90% des cas.

 

Le grand mérite de ce livre est de mettre à portée de non-spécialistes des algos jusque-là réservés aux spécialistes, et ce dans un vaste domaine de l'analyse numérique. Après libre à soi d'aller plus loin. En ce qui me concerne, tout le peu que je sais dans ce domaine, je le dois à ce livre. A l'époque, dans les années 80, les librairies numériques performantes et en libre accès se faisaient plutôt rares, voire étaient inexistantes. Je me souviens qu'on voyait de temps en temps des articles et des livres écrits par des programmeurs du dimanche (souvent des professeurs de lycée ou de math sup), en Turbo Pascal ou Turbo Basic, qui pour résoudre une équation de Laplace, qui pour trouver les zéros d'une fonction. Ca me fascinait et je les implémentais toujours. Mais les méthodes employées étaient très basiques et d'une lenteur frustrante (ahhh, la visualisation d'un champs potentiel qui s'affichait ligne par ligne au bout de N itérations :love:, même en compilé, fallait pas être pressé). Aujourd'hui, les mêmes programment en C++ et avec des algos bcp plus performants qu'avant. NR est passé par là, et a comblé un vide significatif, et ce de manière assez magistrale, je dois dire.

 

Je me souviens d'un gars qui avait fait une lib d'imagerie numérique (à l'époque où je bossais sur un système d'information géographique) et qui avait codé sa FFT à la main. Il se plaignait des perfs: 45s pour une image. La semaine suivante, il revenait tout content parce qu'il avait divisé son temps par 3 ou 4 grâce à des astuces d'optimisation. Alors je lui ai filé le site des NR, et là, il est revenu tout vert en me disant que c'était tombé à 3s. J'étais pas vraiment surpris, même si avec FFTW, il aurait sans doute fait encore mieux.

 

Désolé pour le "My life".


Message édité par el muchacho le 18-03-2007 à 10:47:53
n°1532600
in_your_ph​ion
Posté le 23-03-2007 à 11:04:10  profilanswer
 

lasvegastheking a écrit :

Bonjour,
 
j'ai écrit cette fonction pour obtenir un nombre aléatoire entre min et max inclus.

Code :
  1. //Tirage aleatoire d'un nombre
  2. int hasard(int min, int max){
  3.   return (min + (rand() % (max - min + 1)));
  4. }


 
Cette fonction est utilisé des milliers de fois dans un programme.
Le lancement du mon programme met 17secondes pour afficher les résultats.
 
Je voudrais donc essayer d'améliorer cette fonction pour essayer de la rendre plus rapide.
 
Quelqu'un aurait-il une solution ?
 
Merci


 
man srand :
 
             "If  you want to generate a random integer between 1 and 10, you
              should always do it by using high-order bits, as in
 
                     j=1+(int) (10.0*rand()/(RAND_MAX+1.0));
 
              and never by anything resembling
 
                     j=1+(rand() % 10);
 
              (which uses lower-order bits)."
 
 

n°1532973
Sve@r
Posté le 23-03-2007 à 19:06:42  profilanswer
 

in_your_phion a écrit :

man srand :
 
             "If  you want to generate a random integer between 1 and 10, you
              should always do it by using high-order bits, as in
 
                     j=1+(int) (10.0*rand()/(RAND_MAX+1.0));
 
              and never by anything resembling
 
                     j=1+(rand() % 10);
 
              (which uses lower-order bits)."


 
Mouais... t'as juste 6 jours de retard... :heink:


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1533024
in_your_ph​ion
Posté le 23-03-2007 à 21:31:28  profilanswer
 

Sve@r a écrit :

Mouais... t'as juste 6 jours de retard... :heink:

 

non car ma réference, c'est du béton  :o c'est d'ailleurs etonnant que personne n'ai songé à faire/indiquer ça dès le départ, comme quoi

Message cité 1 fois
Message édité par in_your_phion le 23-03-2007 à 21:33:52
n°1533035
el muchach​o
Comfortably Numb
Posté le 23-03-2007 à 22:06:36  profilanswer
 

C'est les Numerical Recipes, pardi.

n°1533087
in_your_ph​ion
Posté le 24-03-2007 à 02:03:52  profilanswer
 

el muchacho a écrit :

C'est les Numerical Recipes, pardi.


 
mouaaaaaaaais

n°1533915
Sve@r
Posté le 26-03-2007 à 21:22:31  profilanswer
 

in_your_phion a écrit :

c'est d'ailleurs etonnant que personne n'ai songé à faire/indiquer ça dès le départ, comme quoi


Je l'ai indiqué le 17 mars !!!  :o  


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Améliorer la vitesse du fonction donnant un nombre aléatoire

 

Sujets relatifs
comment augmenter le nombre de jointure sur mysql??nombre max d'image par ligne
[PHP]Problème fonction[VBSCRIPT] nombre ?
Vitesse d'execution : bon ou pas bon ?passage d'une fonction comme argument pour une autre fonction (Résolu)
la fonction main[JS] Exécuter une fonction à partir de son nom en variable chaîne
if, nombre négatifVBA access requete SQL et fonction()
Plus de sujets relatifs à : Améliorer la vitesse du fonction donnant un nombre aléatoire


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR