language c : exercice. HELP

  • Auteur de la discussion djkg
  • Date de début

djkg

Nouveau membre
Je suis tout nouveau dans le language c. J'ai un exercice à faire, mais je comprend rien :

Marche aleatoire
Ici on cherche a trouver la distribution des fins de trajets d'un ivrogne marchant sur les entiers dans une dimension.
On s'interesse a la distribution des fins de parcours puisque les mathematiciens nous racontent que ces marches
aleatoires sont intimement lies aux distributions gaussiennes
Vous devez alors completer le programme marche_etudiants.c, compiler, debogger et tracer la distribution
des fins de parcours a l'aide de xmgrace. Une comparaison avec une gaussienne serait tres bien, egalement.
[cpp]
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

/* il faut experimenter avec les valeurs de nombre_pas, nombre_essais */
#define nombre_pas 100
#define nombre_essais 1000000

/* on cherche a trouver la distributions des distances de marches aleatoires dans une dimension

on repete une marche aleatoire d'un nombre_de_pas predetermine
et on cherche la distribution des distances parcourues.
La repition est absolument necessaire - autrement il n'y aurait pas de statistique.*

La methode choisie est assez simple.
*/


int seed; /* variable globale pour la communication entre main et random01 */


/* un generateur aleatoire qui donne une site de nombre pseudo aleatoires entre 0 et 1 */
double random01() {
seed=abs((16807*seed)%((long int) pow(2,31)));
return (1.0*seed)/(pow(2,31)-1);
};


int main() {
int i,e,deplacement; /* bien sur, il faut definir d'autre variables */

int occurences[2*nombre_pas+1];

FILE *fichier; /* pour ecrire les donnes a la fin */

seed=30; /* pour une valeur de 'seed' il y aura toujours la meme suite 'aleatoire' */

/* initialiser occurences=0 */
for (i = -nombre_pas; i < nombre_pas ; i++) occurences[i+nombre_pas]=0;

for (e=0;e < nombre_essais;e++) {



/* une fois la marche aleatoire terminee il faut inscrire la position attente dans le vecteur
occurences: */
occurences[nombre_pas+deplacement]= occurences[nombre_pas+deplacement]+1;

/* fin essais */};

/* ecrire les resultats dans un fichier */
fichier = fopen("resultat","w");
for (i = -nombre_pas; i < nombre_pas ; i++)
fprintf(fichier,"%d %d \n",i,occurences[i+nombre_pas]);
fclose(fichier);

return 0;};
[/cpp]

éclairez moi svp merci
 

boub popsyteam

Grand Maître
Merci d'editer ton post avec
Vous devez être connecté pour voir les images.
afin de rajouter les balises
Code:
 avec le bouton [img]http://img.presence-pc.com/forum/icones/message/c.gif[/img]

Ca rendra bien plus lisible ton code et ainsi facilitera la réponse à ta question :)
 

djkg

Nouveau membre
En effect c'est plus lisible.
je ne comprend pas ce qu'il faut faire et je n'ai jamais vu une variable avec des [] : occurences[nombre_pas+deplacement]. Qu'est-ce?
 

boub popsyteam

Grand Maître
[] indique que c'est un tableau, la valeur dedans est le numéro de cellule ...
 

djkg

Nouveau membre
Merci!
j'ai un autre broblème avec Dev-c++, quand je débug j'ai un message d'erreur : "Une violation d'accès (erreur de segmentation) est apparue..."
de l'aide serait la bienvenue
merci
 

KangOl

Grand Maître
désolé, mais j'ai pas fait bac V :o

par contre, si tu peux, utilises Code::Blocks ;)
 

sabiokah

Nouveau membre
"Une violation d'accès (erreur de segmentation) est apparue..."
Typically Win32 :)
En fait le probleme est que probablement tu as essayer d'acceder a une adresse a l'exeterieur d'un de tes tableaux.
occurences[nombre_pas+deplacement] est offset ?

En regardant ton code je suis vraiment pas certaint que tout test access a occurences se font a l'interieur de int occurences[2*nombre_pas(100)+1];

Habituellement une bonne seance en mode debug avec le debugger vas pouvoir detecter cette erreur.

Aussi ca simplifirais beaucoup simplifier ton code si tu utilise :
[cpp]
/* initialiser occurences=0 */
for (i =0; i < nombre_pas ; i++) occurences=0;
[/cpp]
au lieu de
[cpp]
/* initialiser occurences=0 */
for (i = -nombre_pas; i < nombre_pas ; i++) occurences[i+nombre_pas]=0;
[/cpp]

Mais la vrai ligne qui fait planter ton code est:
[cpp]
for (e=0;e < nombre_essais;e++)
occurences[nombre_pas+deplacement]= occurences[nombre_pas+deplacement]+1;
[/cpp]
Puisque deplacement n'est jamais initialiser.
En mode debug par default deplacement vas probablement etre egale a 0 mais pas en mode release. Il garde une valeur radom de la memoire ( possiblement beaucoup plus grande que 1).

Pourquoi ne pas remplacer:
[cpp]
for (e=0;e < nombre_essais;e++)
occurences[nombre_pas+deplacement]= occurences[nombre_pas+deplacement]+1;
[/cpp]
par
[cpp]

occurences[nombre_pas+deplacement]+= nombre_essais;
[/cpp]
? ( et ne pas oublier d'initialiser depacement )


 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 128
Messages
6 717 850
Membres
1 586 373
Dernier membre
https://forum.tomshardwar
Partager cette page
Haut