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

  FORUM HardWare.fr
  Programmation

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°140007
John of th​e Baptiste
power of the siesta !
Posté le 16-05-2002 à 18:06:43  profilanswer
 

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:

mood
Publicité
Posté le 16-05-2002 à 18:06:43  profilanswer
 

n°140016
Willyzekid
Posté le 16-05-2002 à 18:18:12  profilanswer
 

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!!
n°140019
John of th​e Baptiste
power of the siesta !
Posté le 16-05-2002 à 18:22:13  profilanswer
 

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 !!!).

n°140020
John of th​e Baptiste
power of the siesta !
Posté le 16-05-2002 à 18:23:26  profilanswer
 

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 !

n°140021
Willyzekid
Posté le 16-05-2002 à 18:23:59  profilanswer
 

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!!
n°140023
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 16-05-2002 à 18:24:48  profilanswer
 

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)
n°140024
John of th​e Baptiste
power of the siesta !
Posté le 16-05-2002 à 18:25:57  profilanswer
 

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.

n°140025
John of th​e Baptiste
power of the siesta !
Posté le 16-05-2002 à 18:26:57  profilanswer
 

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:

n°140029
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 16-05-2002 à 18:32:17  profilanswer
 

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)
n°140032
John of th​e Baptiste
power of the siesta !
Posté le 16-05-2002 à 18:39:34  profilanswer
 

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

mood
Publicité
Posté le 16-05-2002 à 18:39:34  profilanswer
 

n°140035
John of th​e Baptiste
power of the siesta !
Posté le 16-05-2002 à 18:47:01  profilanswer
 

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:

n°140036
darkoli
Le Petit Dinosaure Bleu
Posté le 16-05-2002 à 18:49:51  profilanswer
 

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
n°140037
John of th​e Baptiste
power of the siesta !
Posté le 16-05-2002 à 19:00:19  profilanswer
 

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 ?

n°140042
darkoli
Le Petit Dinosaure Bleu
Posté le 16-05-2002 à 19:04:28  profilanswer
 

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
n°140044
John of th​e Baptiste
power of the siesta !
Posté le 16-05-2002 à 19:06:37  profilanswer
 

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 ?

n°140047
darkoli
Le Petit Dinosaure Bleu
Posté le 16-05-2002 à 19:15:05  profilanswer
 

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
n°140049
John of th​e Baptiste
power of the siesta !
Posté le 16-05-2002 à 19:17:47  profilanswer
 

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 !

n°140265
John of th​e Baptiste
power of the siesta !
Posté le 17-05-2002 à 10:37:02  profilanswer
 

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.


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

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

 

Sujets relatifs
[PHP aléatoire]Je n'en puis plus :fou: besoin d'un oeil neufPLSQL : Generation de requete HELP
[SQL + PHP ] - Tirage aleatoire dans une db?[PHP] - Voir la vitesse de generation d'un page par le serveur
[PHP] - Choix de nombres aleatoire tous different !?[PHP]Chiffre aléatoire
génération de checksum (ou CRC, ou ID)CALCUL UN NOMBRE ALEATOIRE
[PROBA]Chance d'avoir deux nombres pareil 
Plus de sujets relatifs à : [V C++] génération de nombres aléatoire qui chie dans la colle...


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)