[V C++] génération de nombres aléatoire qui chie dans la colle...

génération de nombres aléatoire qui chie dans la colle... [V C++] - Programmation

Marsh Posté le 16-05-2002 à 18:06:43    

Salut !
En ce moment je fais du Visual c++. Pour apprendre à l'utiliser, je m'amuse pendant mes heures libres (très nombreuses, evidemment !) à programmer un petit logiciel de gestion de la coupe du monde de football ( qui pourrait être étendu à tout autre compet, je pense). Pour essayer si ça marche, j'ai décidé de créer des équipes imaginaire automatiquement. Je leur affecte
un groupe aléatoirement ( pour mémoire, pendant le premier tour de la coupe du monde, les équipes sont réparties en 8 poules de 4 équipes). Pour chaque équipe, je tire donc un nombre entre 0 et 7 ( qui représente un numéro de groupe) et je regarde si le groupe en question ne comporte pas déjà 4 équipes. Si il y a de la place dans ce groupe, j'y inclus l'équipe, sinon, je recommence le tirage aléatoire jusqu'à ce que l'équipe trouve de la place dans un groupe.
J'ai défini une fonction random que voici :
 
int random(int borne)
{  
 int resrand;  
 resrand = (rand() % borne);
 return resrand;
}
 
J'ai bien initialisé le générateur avec un srand().  
Tout ceci marche à la perfection jusqu'au deuxième tirage aléatoire. Le random sort alors ce nombre :-858993460.
Je comprend pas. Problème de mémoire, peut-être ?
Help ! :cry:

Reply

Marsh Posté le 16-05-2002 à 18:06:43   

Reply

Marsh Posté le 16-05-2002 à 18:18:12    

il sort d'où ton "borne"?
(ie. file aussi l'appel de la fonction)
 
T'as pas un debugger là?

 

[jfdsdjhfuetppo]--Message édité par Willyzekid le 16-05-2002 à 18:18:31--[/jfdsdjhfuetppo]


---------------
Horizon pas Net, reste à la buvette!!
Reply

Marsh Posté le 16-05-2002 à 18:22:13    

Willyzekid a écrit a écrit :

il sort d'où ton "borne"?
(ie. file aussi l'appel de la fonction)
 
T'as pas un debugger là?  
 
 




 
mon borne, c'est un entier qui me définit la plage de génération (entre 0 et borne - 1). J'ai un debugger, mais je vois juste que ça couille dans le 2 eme random. Ensuite, il me montre un truc barbare ( de l'assembleur) et me demande si je veux debugger rand.c !!!).

Reply

Marsh Posté le 16-05-2002 à 18:23:26    

En plus, j'ai essayé de faire 10 random de suite ailleurs dans le prog. Je les affiche et ça marche... je suis aux fraises !

Reply

Marsh Posté le 16-05-2002 à 18:23:59    

oui ben tu modifie sans doute ton borne en cour de route!!! c'est pour ca que je demande l'appelle de ta fonction! Je me doute bien que borne n'est pas là pour faire joli :)
 
Quand au debbuger, utilise le pas à pas! Et vois comment ca se passe!


---------------
Horizon pas Net, reste à la buvette!!
Reply

Marsh Posté le 16-05-2002 à 18:24:48    

tu devrais mettre un spy sur la variable borne, et voir sa valeur lors du 2eme passage


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 16-05-2002 à 18:25:57    

Willyzekid a écrit a écrit :

oui ben tu modifie sans doute ton borne en cour de route!!! c'est pour ca que je demande l'appelle de ta fonction! Je me doute bien que borne n'est pas là pour faire joli :)
 
Quand au debbuger, utilise le pas à pas! Et vois comment ca se passe!  




 
for (i = 0; i < 32; i++)
 {  
  testnbEG = false;
  resrand = 0;
  while ( ! testnbEG)
  { resrand = random(8);
    if (tnbEG[resrand] < 3)
    { testnbEG = true;
   tnbEG[resrand]++;
   taffE[i] = resrand;
    }
  }
 }
 
Voilà la partie de code ou je l'appelle.

Reply

Marsh Posté le 16-05-2002 à 18:26:57    

Harkonnen a écrit a écrit :

tu devrais mettre un spy sur la variable borne, et voir sa valeur lors du 2eme passage  




 
je sais pas faire ça ! :pt1cable:

Reply

Marsh Posté le 16-05-2002 à 18:32:17    

lorsque tu débugges avec le débugger de vc++, tu as dans le menu Debug des options qui te permettent de surveiller une variable au fur et a mesure de l'éxecution du prog
 
utilise la fonction Quickwatch pour surveiller borne
 
ou alors poste ton source pour qu'on puisse voir le cycle de vie de cette variable


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 16-05-2002 à 18:39:34    

Ben je crois pas que c'est borne qui va pas, elle est toujours à 8.

Reply

Marsh Posté le 16-05-2002 à 18:39:34   

Reply

Marsh Posté le 16-05-2002 à 18:47:01    

Je crois que j'ai trouvé...  
C'est effectivement un probleme de mémoire. Quand j'initialise resrand, le debugger me dit : error : variable needs stack.
chiotte !
bon j'y retourne !
Merci pour vos réponses !  :hello:

Reply

Marsh Posté le 16-05-2002 à 18:49:51    

John of the Baptiste a écrit a écrit :

 
 
for (i = 0; i < 32; i++)
 {  
  testnbEG = false;
  resrand = 0;
  while ( ! testnbEG)
  { resrand = random(8);
    if (tnbEG[resrand] < 3)
    { testnbEG = true;
   tnbEG[resrand]++;
   taffE[i] = resrand;
    }
  }
 }
 
Voilà la partie de code ou je l'appelle.  




 

Code :
  1. for (i = 0; i < 32; i++)
  2. {
  3.  testnbEG = false;
  4.  resrand = 0;
  5.  while (testnbEG != true)
  6.   {
  7.    resrand = random(8);
  8.    if (tnbEG[resrand] < 3)
  9.     {
  10.      testnbEG = true;
  11.      tnbEG[resrand]++;
  12.      taffE[i] = resrand;
  13.     }
  14.   }
  15. }


 
Ce n'est pas 4 à la place de 3 ? (à moins que tu considères que 0 veut dire une equipe ?)
 

Code :
  1. int  taffE[32]; // Tableau d'affectation des equipes
  2. int  i=0;       // compteur
  3. int  e1=0;      // equipe 1
  4. int  e2=0;      // equipe 2
  5. int  tmp=0;     // valeur temporaire
  6. // Assignation par défaut des groupes
  7. // Les 4 premières equipes ont le groupe 0, ...
  8. for (i = 0; i < 32; i++) taffE[i >> 2];
  9. // Melange des assignations
  10. for (i = 0; i < 500; i++)
  11. {
  12.   e1=random(32); // resultat entre 0 et 31
  13.   e2=random(31); // resultat entre 0 et 30, on choisit une des 31 équipes restantes
  14.   if (e2 >= e1) e2++;
  15.   tmp=taffE[e1];
  16.   taffE[e1]=taffE[e2];
  17.   taffE[e2]=tmp;
  18. }


 
Voilà une autre manière de faire le mélange. On utilise pas le while car si tu n'as pas de chance lors du choix du random tu peux faire plein d'iteration pour rien.


---------------
Le site de l'année :D (XHTML 1.0 strict) : http://darkoli.free.fr/index.html
Reply

Marsh Posté le 16-05-2002 à 19:00:19    

Merci c'est cool !
Cependant, ça fait chier si je fais pleins d'itérations pour le stack ?  
 
Autre question :
Si je déclare : CObjet tab[10];
 => stocké dans le tas
 
CObjet *tab;
tab = new CObjet[10]
 => stocké ailleurs
 
j'ai bon ?

Reply

Marsh Posté le 16-05-2002 à 19:04:28    

John of the Baptiste a écrit a écrit :

Merci c'est cool !
Cependant, ça fait chier si je fais pleins d'itérations pour le stack ?




 
Je dirais que moins y'a d'iterations, mieux c'est.


---------------
Le site de l'année :D (XHTML 1.0 strict) : http://darkoli.free.fr/index.html
Reply

Marsh Posté le 16-05-2002 à 19:06:37    

DarkOli a écrit a écrit :

 
 
Je dirais que moins y'a d'iterations, mieux c'est.  




 
Bon ben merci, je vais étudier ton algo. Où tu as appris à faire de jolies choses comme ça ?

Reply

Marsh Posté le 16-05-2002 à 19:15:05    

John of the Baptiste a écrit a écrit :

 
 
Bon ben merci, je vais étudier ton algo. Où tu as appris à faire de jolies choses comme ça ?  




 
Ben programmant  et en DUT info aussi.


---------------
Le site de l'année :D (XHTML 1.0 strict) : http://darkoli.free.fr/index.html
Reply

Marsh Posté le 16-05-2002 à 19:17:47    

DarkOli a écrit a écrit :

 
 
Ben programmant  et en DUT info aussi.  




 
Je suis en licence d'info mais on a jamais abordé la question de la gestion de la mémoire en cours. Je suis perdu dans la jungle, avec mon coupe coupe comme seul ami !

Reply

Marsh Posté le 17-05-2002 à 10:37:02    

Salut !
 
Un prof m'a dit ce matin qu'on pouvait augmenter la taille de la pile dans Visual. Quelqu'un sait-il le faire ?
Merci d'avance.

Reply

Sujets relatifs:

Leave a Replay

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