ChaineMarkov allouerChaineMarkov(int nbEtats);
void affecterProbaTransition(
    ChaineMarkov * pcm,int i, int j, float proba);
void affecterNomEtat(ChaineMarkov * pcm,int i,
                     char * nomEtat);
int transitionNEtapes(ChaineMarkov cm,
                      int etat0, int n);
int main()
{
  ChaineMarkov cm;
  int etatn, i;
  int eff[3] = {0,0,0};

  cm = allouerChaineMarkov(3);
  affecterNomEtat(& cm,0,"Dormir");
  affecterNomEtat(& cm,1,"Manger");
  affecterNomEtat(& cm,2,"Faire de l'exercice");
  affecterProbaTransition(& cm,0,0,0.9);
  affecterProbaTransition(& cm,0,1,0.05);
  affecterProbaTransition(& cm,0,2,0.05);

  affecterProbaTransition(& cm,1,0,0.7);
  affecterProbaTransition(& cm,1,2,0.3);

  affecterProbaTransition(& cm,2,0,0.8);
  affecterProbaTransition(& cm,2,2,0.2);

  for(i = 1; i <= N; i++) {
      etatn = transitionNEtapes(cm,1,8);
      printf("Simulation %d : l'étape %d : etat %s\n",
             i,2, cm.nomEtat[etatn]);
      eff[etatn]++;
  }

  for(i = 0; i < 3; i++)
    printf("freq %15s = %5.3f\n",
           cm.nomEtat[i], (float)eff[i]/N);
    return 0;

}

ChaineMarkov allouerChaineMarkov(
    int nbEtats)
{
    ChaineMarkov cm;
    int i,j;

    cm.nbEtats = nbEtats;
    cm.pMatriceTransition =
        (float **)malloc(
        nbEtats * sizeof(float *));
    for(i=0; i < nbEtats; i++) {
        cm.pMatriceTransition[i] =
        (float *)malloc(
        nbEtats * sizeof(float));
        for(j = 0; j < nbEtats; j++)
            cm.pMatriceTransition[i][j] =
                (float)0.0;
    }
    cm.nomEtat = (char **)
        malloc(nbEtats * sizeof(char*));
    for(i = 0; i < nbEtats; i++) {
        cm.nomEtat[i] =
            malloc(TAILLE_NOM * sizeof(char));
        sprintf(cm.nomEtat[i],"%d",i+1);
    }
    return cm;
}

void affecterProbaTransition(
    ChaineMarkov * pcm,int i, int j,
    float proba)
{
    (*pcm).pMatriceTransition[i][j] =
        proba;
}

void affecterNomEtat(ChaineMarkov * pcm,int i,
                     char * nomEtat)
{
    strcpy((*pcm).nomEtat[i],nomEtat);
}

int transitionNEtapes(ChaineMarkov cm,
                      int etat0, int n)
{
    int etatn, i;
    IndiceValeur iv;
    float * pvaleurs;

    etatn = etat0;
    pvaleurs = (float *)malloc(
        cm.nbEtats * sizeof(float));
    for(i = 0; i < cm.nbEtats; i++) {
        pvaleurs[i] = i+1;
    }

    for(i = 1; i <= n ; i++) {
        iv = simulLoiDiscreteFinie(
        pvaleurs,
        cm.pMatriceTransition[etatn] );
        etatn = iv.indice;
    }
    free(pvaleurs);
    return etatn;
 }

