Forum Clubic

Un peu d'aide (random en c)

Salut à tous,
je suis en train de développer un petit “tchat bot” en C, extrêmement basique, rien que pour m’amuser.

Pour le moment, je n’ai que des fonctions simples (if “bonjour” > puts “salut” else if “au revoir” > puts “A plus!”)
Rien de folichon donc, du moment que je respecte la casse (minuscules, sans accent etc. ça passe très bien et je n’en demande pas plus)

Par contre, j’aimerais pouvoir mettre dans chaque condition 2 ou 3 réponses aléatoires, et je suis totalement perdu. Je ne maîtrise pas du tout ça et j’ai beaucoup de mal à insérer ma fonction rand comme il le faut.

J’aimerais donc savoir si quelqu’un peut m’aider à déclarer la fonction rand correctement avec srand, et tirer un nombre au hasard entre 1 et 3 pour avoir entre 1 et 3 réponses aléatoires dans chaque fonction.

Exemple :

if (strcmp(chaine, "bonjour")==0)
      puts("Bonjour !");

Une fois le srand correctement déclaré, comment modifier cette fonction pour avoir une réponse aléatoire correcte ?

Merci d’avance !

PS : Si vous pouvez me corriger c’est bien, mais étant donné que je fais ça pour le plaisir de le faire, si vous pouvez en plus m’expliquer ne serait-ce que rapidement le pourquoi du comment, ça m’aiderais.

Comme le dit la doc : pwet.fr… :slight_smile:

srand initialise le “seed”. En fait, tu fais du pseudo aléatoire; donc quand tu fais srand(1), chaque appel de rand() te renverra la même chose, ex:

srand(1); rand(); // renvoie n 
srand(1); rand(); // renvoie n aussi.

Tu dois l’utiliser comme ça, pour une valeur entre n et m :

double n = 1.0;
double m = 10.0;
int j =1+(int) (m*rand()/(RAND_MAX+n))

j contiendra ta valeur pseudo aléatoire.

Pour ça ca va a peu près, c’est pour l’utiliser dans une de mes fonctions que ça coince.

Je ne sais pas comment faire pour faire “si xxx = yyy, alors zzz, ou zzz 2, ou zzz3”
:etonne2:

En gros, en fonction d’un résultat aléatoire tu veux renvoyer une valeur aléatoire ?
Tu as la solution “simple” : suppose que la fonction rand() soit définie dans une macro :

#define getrandomvalue(min, max) (1+(int)(((double)max*rand() / (RAND_MAX+(double)min))

(je te laisse corriger les erreurs de parenthèse).

Tu peux faire ça par la suite :

if (strcmp(chaine, "bonjour")==0) {
  switch (getrandomvalue(0, 5)) {
   case 0: return "ah ah";
   ...
   case 5: return "oh oh";
   default: return "<erreur valeur non gérée>";
  }
}

Et tu peux “optimiser” ça avec un tableau de valeur :

static const char* const * values = {
  "ah ah",
  "oh oh",  
};
return values[getrandomvalues(0, sizeof(values)/sizeof(*values))];