[C++] conversion double en int ?

conversion double en int ? [C++] - C++ - Programmation

Marsh Posté le 15-04-2004 à 17:38:48    

slt à tous,
 
voilà j'ai un petit problème, je vous montre

Code :
  1. double rnd_tmp;
  2. rnd_tmp = rand()*nb_colors;
  3. rnd_tmp = floor(rnd_tmp);
  4. tab_code[i] = tab_colors[rnd_tmp];


 
donc en fait je génère un nombre aléatoire (entre 0 et 1), je le multiplie par le nombre de couleurs et je l'arrondis. Ensuite avec ce nombre arrondi (donc qui est un pseudo entier) je selectionne un index du tableau.
Le problème ce que pour un index il faut un "vrai" int et non pas un double du genre 5.00.
 
Voilà mon petit problème si quelqu'un à la solution :)
 
merci d'avance !

Reply

Marsh Posté le 15-04-2004 à 17:38:48   

Reply

Marsh Posté le 15-04-2004 à 17:41:20    

quel est le problème ? ensuite tu fous tout ça dans un int et voilà ... enfin size_t plutot. fait attention aux débordements.
 
ton usage de rand est mauvais
 

Citation :

      Dans Numerical Recipes in C: The Art of Scientific  Computing  (William
       H.  Press, Brian P. Flannery, Saul A. Teukolsky, William T. Vetterling;
       New York: Cambridge University Press, 1990 (1st ed, p. 207)),  le  com‐
       mentaire suivant apparaît :
              "Si  vous  désirez  engendrer un entier aléatoire entre 1 et 10,
              vous devez toujours procéder en  utilisant  les  bits  de  poids
              forts, comme dans :
                                                                                 
                     j=1+(int) (10.0*rand()/(RAND_MAX+1.0));
                                                                                 
              et jamais ainsi :
                                                                                 
                     j=1+(rand() % 10);
                                                                                 
              (car cette derniere version utilise les bits de poids faibles)."
                                                                                 
       La génération de nombres aléatoires est un domaine complexe.  Le  livre
       Numerical  Recipes  in  C  (référence ci-dessus) fournit une excellente
       présentation pratique d?un générateur  aléatoire  dans  le  chapitre  1
       (Random Numbers).

Reply

Marsh Posté le 15-04-2004 à 17:50:02    

bah oui mais si je mets ça dans un int tout bêtement il me sort un warning... ça fait pas très propre :p
(conversion from 'double' to 'int', possible loss of data)


Message édité par ofbdood le 15-04-2004 à 17:50:22
Reply

Marsh Posté le 15-04-2004 à 17:56:12    

bah ouais ... faut caster un peu bourrin. commence par faire une fonction qui te renvoie un entier aléatoire déjà. ensuite utilise là. ou alors utiliser stl/boost/sgi y a tout ce que tu veux pour sélectionner au hasard un élément dans une séquence


Message édité par Taz le 15-04-2004 à 17:57:15
Reply

Marsh Posté le 15-04-2004 à 17:59:57    

oué ok je vais voir tout ça
d'ailleurs ça m'a l'air pas mal ça : http://home1.gte.net/deleyd/random/crandom.html
 
merci pour ton aide

Reply

Marsh Posté le 15-04-2004 à 18:00:50    

c'est exactement ce que je t'ai conseillé

Reply

Marsh Posté le 15-04-2004 à 18:09:53    

j'ai pas dis le contraire, c'était dans ma recherche en parallèle :p
 
voilà ça me donne ça :

Code :
  1. double rnd_tmp;
  2.  int rnd_index;
  3.  srand(10000);
  4.  rnd_tmp = ((double)rand()/(double)(RAND_MAX+1));
  5.  rnd_tmp = rnd_tmp * nb_colors;
  6.  rnd_index = (int)rnd_tmp;
  7.  tab_code[i] = tab_colors[rnd_index];


 

Reply

Marsh Posté le 15-04-2004 à 18:12:03    

voilà. maintenant encapsule tout ça dans une fonction pour que ça fasse plus propre

Reply

Marsh Posté le 15-04-2004 à 18:21:35    

Oui c'est déjà dans une fonction sauf que j'ai pas tout copié...

Reply

Marsh Posté le 15-04-2004 à 18:28:24    

ofbdood a écrit :

j'ai pas dis le contraire, c'était dans ma recherche en parallèle :p
 
voilà ça me donne ça :

Code :
  1. double rnd_tmp;
  2.  int rnd_index;
  3.  srand(10000);
  4.  rnd_tmp = ((double)rand()/(double)(RAND_MAX+1));
  5.  rnd_tmp = rnd_tmp * nb_colors;
  6.  rnd_index = (int)rnd_tmp;
  7.  tab_code[i] = tab_colors[rnd_index];


 
 


Je me permettrais juste 2 remarques :
- il vaut mieux utiliser une valeur variable ppour ton srand() plutot qu'une valeure fixe. Par exemple un compteur système ou tout simplementl'heure
- tu n'es pas obligé d'utiliser autant de variable, tu peux même tout écrire, le cast y compris en une ligne, mais ça c'est plus une question de gout :)
 
bonne continuation


Message édité par fli le 15-04-2004 à 18:29:21
Reply

Marsh Posté le 15-04-2004 à 18:28:24   

Reply

Marsh Posté le 15-04-2004 à 18:44:02    

Mais là tu auras une troncature, pas un arrondi, il faut ajouter ou retrancher 0.5 suivant le signe, dans ton cas rajouter suffit :

Code :
  1. rnd_tmp = rnd_tmp * nb_colors + 0.5;

Reply

Marsh Posté le 15-04-2004 à 18:45:22    

floor et ceil sont là :o

Reply

Marsh Posté le 15-04-2004 à 18:53:37    

Désolé mais ça ne fait pas vraiment un arrondi dans le principe ça ...
Je préfère ma méthode ;)

Reply

Marsh Posté le 15-04-2004 à 19:01:05    

Vous battez pas :p, dans mon cas ça n'a que peu d'importance (du moment que j'adapte correctement derrière)
 
pour le srand effectivement je vais mettre l'heure parce que là, la première fois il me resort tjs la même combinaison (ce qui est logique en fait)
 
Pour ce qui est de l'écriture pour l'instant je fais mon petit truc et quand tout marchera bien j'optimiserais un peu :)

Reply

Marsh Posté le 15-04-2004 à 22:29:08    

Cricri_ a écrit :

Désolé mais ça ne fait pas vraiment un arrondi dans le principe ça ...
Je préfère ma méthode ;)
 

ben alors tu utilises round :o

Reply

Marsh Posté le 16-04-2004 à 00:16:25    

Question peut être un peu stupide, mais pourquoi ne faut'il pas utiliser les bit de poids faibles ?

Reply

Marsh Posté le 16-04-2004 à 01:19:49    

Ben c'est écrit dans le lien donné plus haut http://home1.gte.net/deleyd/random/crandom.html
 
C'est parce que, dans une implémentation souvent utilisée de générateur de nombres pseudo-aléatoires, les bits de poids faibles ont tendance à être "moins aléatoires" que ceux de poids fort.

Reply

Marsh Posté le 16-04-2004 à 09:18:10    

Taz a écrit :

ben alors tu utilises round


zarbi je ne trouve pas ... c'est standard ça ??

Reply

Marsh Posté le 16-04-2004 à 09:23:11    

Citation :

Note: on Microsoft Visual C++ 6.0, if seed is negative than a seed value from the system clock is used. Also check for a randomize() function on your compiler.


 
Ca veut dire que un random avec seed=-1 choppe lheure système en lieu et place de -1 sous VC++ ?

Reply

Marsh Posté le 16-04-2004 à 13:33:19    

cricri_ a écrit :


zarbi je ne trouve pas ... c'est standard ça ??

C99

Reply

Marsh Posté le 18-04-2004 à 16:21:18    

Petites simplifications...
 
double fdRoundTemp;  
srand(10000);  //Ou le le timer
 
fdRoundTemp = ((double)rand()/(double)(RAND_MAX+1));  
fdRoundTemp *= (double)lNbColors;  
tab_code[i] = tab_colors[(long)fdRoundTemp];
 
PS:le int à un problème, sur certains compilateurs, il est en 16, 24, 32, 48 voire 64 bits... Avec un long (ou un short), pas de problème

Reply

Marsh Posté le 18-04-2004 à 16:26:33    

christophe_d13 a écrit :


PS:le int à un problème, sur certains compilateurs, il est en 16, 24, 32, 48 voire 64 bits... Avec un long (ou un short), pas de problème

même problème avec les long
 
le type a utilisé est size_t .|

Reply

Marsh Posté le 18-04-2004 à 16:30:42    

oui, short est fixé a 16 bits mais long est le type natif, 32 bits sur les machines 32 bits, 64 pour les machines 64 bits ...

Reply

Marsh Posté le 18-04-2004 à 16:42:29    

rien ne dit ça ... il y a juste des exigences de minima et de relation d'ordre dans les sizeof, rien de plus.

Reply

Marsh Posté le 18-04-2004 à 16:52:09    

PS: long est au minimum en 32 bits... alors que int varie.
malheureusement l'ansi n'a pas fixée et normalisée le type 32 et 64 bits... Résultat avec GCC pour le 64 bits on fait du "long long" et "__int64" avec VC.
 
Mais on s'éloigne du sujet.

Reply

Marsh Posté le 18-04-2004 à 17:30:35    

mais le long long est standard :o
 
non, on ne s'éloigne pas. tu nous fais toi même la démonstration du flou qu'il existe, t'essaie de te rattraper aux branches. moi je dis "utilise size_t", ce type entier non-signé est fait pour ça

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed