OVH Cloud OVH Cloud

[Débutant] 2 nombres aléatoires

27 réponses
Avatar
Dudule
Bonjour,

Dans le cadre d'un exercice d'apprentissage, je dois créer 2 nombres
aléatoires.
J'ai utilisé 2 srand, mais la solution utilisée ne me semble pas très
élégante...
Si vous avez autre chose à suggérer, cela serait bienvenu. :-)


int main()
{
int a,b,c;

while (true)
{
srand(time(0));
a=rand()%10+1;
srand(time(0)/4);
b=rand()%10+1;
cout << "Combien font " << a << "x" << b << " ?" << endl;
cin >> c;
if (c==a*b)
cout << "Bravo ! Résultat exact !" << endl;
else
cout << "Désolé... Mauvaise réponse." << endl;
cout << endl;
}

return 0;
}

10 réponses

1 2 3
Avatar
Vincent Lascaux
int main()
{
int a,b,c;


Il est préférable de déclarer les variables dans le plus petit bloc
possible, donc à l'interieur de la boucle


while (true)
{
srand(time(0));


Il n'est pas nécessaire de faire plusieurs appels à srand dans un même
programme. Il faut sortir cette ligne de la boucle

a=rand()%10+1;
srand(time(0)/4);


De même, cette ligne ne devrait pas être

b=rand()%10+1;
cout << "Combien font " << a << "x" << b << " ?" << endl;
cin >> c;
if (c==a*b)
cout << "Bravo ! Résultat exact !" << endl;
else
cout << "Désolé... Mauvaise réponse." << endl;
cout << endl;
}

return 0;
}



Le reste m'a l'air plutot bien...
Le nom des variables (a,b,c) est assez mal choisi (pour a, b, ca se concoit,
pour c, ca pourrait être reponse)
Certains chipoteraient qu'utiliser % avec rand ne permet pas d'obtenir une
répartition uniforme... Je pense pas que ce soit vraiment critique ici :)

--
Vincent

Avatar
Cyrille
Bonjour,

Dans le cadre d'un exercice d'apprentissage, je dois créer 2 nombres
aléatoires.
J'ai utilisé 2 srand, mais la solution utilisée ne me semble pas très
élégante...


Euh, pour ce que vous voulez faire, vous n'avez besoin que d'un srand()
*pour toute l'application*. srand() initialise le générateur de nombres
aléatoires. Après, chaque appel à rand() vous donnera un nombre
aléatoire différent.

Donc écrivez ceci:
int main()
{
srand(time(0));
while (true)
{
int a = rand()%10 + 1;
int b = rand()%10 + 1;
....

--
win the yes need the no to win against the no!

Avatar
Fabien LE LEZ
On Mon, 16 May 2005 00:27:44 +0200, "Vincent Lascaux"
:

srand(time(0));


Il n'est pas nécessaire de faire plusieurs appels à srand dans un même
programme. Il faut sortir cette ligne de la boucle


En fait, c'est même catastrophique : on réinitialise le générateur
avec time(0), c'est-à-dire toujours la même valeur si le programme
s'exécute en moins d'une seconde. Du coup, rand() renvoie à chaque
fois le même nombre.

--
Le grand site de la philosophie animale : <http://perso.edulang.com/philo/>


Avatar
Fabien LE LEZ
On Mon, 16 May 2005 00:27:44 +0200, "Vincent Lascaux"
:

int a,b,c;


Il est préférable de déclarer les variables dans le plus petit bloc
possible, donc à l'interieur de la boucle


Et surtout, de donner des noms plus explicites !
--
Le grand site de la philosophie animale : <http://perso.edulang.com/philo/>


Avatar
Vincent Lascaux
Et surtout, de donner des noms plus explicites !


Lire mon post jusqu'au bout...
J'ai du mal à trouver un bon nom pour a et b... Je serais d'avis de laisser
a et b et de rajouter un commentaire type "a est le premier nombre saisi par
l'utilisateur, b le second"...

--
Vincent

Avatar
Fabien LE LEZ
On Mon, 16 May 2005 02:38:33 +0200, "Vincent Lascaux"
:

J'ai du mal à trouver un bon nom pour a et b... Je serais d'avis de laisser
a et b et de rajouter un commentaire type "a est le premier nombre saisi par
l'utilisateur, b le second"...


Si une variable représente le premier nombre, un nom plus ou moins
adapté serait premier_nombre.

--
Le grand site de la philosophie animale : <http://perso.edulang.com/philo/>

Avatar
Pierre THIERRY
Le Mon, 16 May 2005 02:27:35 +0200, Fabien LE LEZ a écrit :
on réinitialise le générateur avec time(0), c'est-à-dire toujours la
même valeur


L'argument de time() est un pointeur vers une structure time_t où
stocker le résultat (l'heure actuelle), en plus de le retourner.

Documentairement,
Nowhere man
--

OpenPGP 0xD9D50D8A

Avatar
Fabien LE LEZ
On 16 May 2005 13:37:05 +0200, Gabriel Dos Reis
:

Pierre THIERRY writes:


Est-ce que je suis le seul à ne pas voir les messages de Pierre
THIERRY ? Ils n'apparaissent pas sur news.free.fr, et apparemment tu
es le seul à y répondre -- donc peut-être le seul à les voir ?

--
Le grand site de la philosophie animale : <http://perso.edulang.com/philo/>

Avatar
Gabriel Dos Reis
Pierre THIERRY writes:

| Le Mon, 16 May 2005 02:27:35 +0200, Fabien LE LEZ a écrit :
| > on réinitialise le générateur avec time(0), c'est-à-dire toujours la
| > même valeur
|
| L'argument de time() est un pointeur vers une structure time_t où
| stocker le résultat (l'heure actuelle), en plus de le retourner.

ISO/IEC 9899:1999 (E), §7.23.2.4:

7.23.2.4 The time function

Synopsis

[#1]

#include <time.h>
time_t time(time_t *timer);

Description

[#2] The time function determines the current calendar time.
The encoding of the value is unspecified.

Returns

[#3] The time function returns the implementation's best
approximation to the current calendar time. The value
(time_t)(-1) is returned if the calendar time is not
available. If timer is not a null pointer, the return value
is also assigned to the object it points to.

-- Gaby
Avatar
Pierre THIERRY
Le Sun, 15 May 2005 23:42:29 +0200, Dudule a écrit :
J'ai utilisé 2 srand, mais la solution utilisée ne me semble pas très
élégante...


Non, pas vraiment.

Si vous avez autre chose à suggérer, cela serait bienvenu. :-)


Là, ce n'est pas critique, mais en règle générale, il faut éviter de
créer soi-même ses nombres aléatoires si on a besoin qu'ils soient de
qualité.

Autant utiliser un bibliothèque d'objets fournissant des générateurs de
nombres aléatoires de qualité, par exemple Coyotl :

http://www.coyotegulch.com/products/libcoyotl/

libcoyotl contient 5 PRNG différents, chacun avec la même interface.

#include <iostream>
#include <libcoyotl/mtwister.h>

using namespace std;
using namespace libcoyotl;

int main()
{
mtwister random;
int multiple1, multiple2, reponse;

while (true)
{
multiple1 = random.get_rand_range(1, 10);
multiple2 = random.get_rand_range(1, 10);
cout << "Combien font " << multiple1 << "x" << multiple2 << " ?" << endl;
cin >> reponse;
if (reponse == multiple1 * multiple2)
cout << "Bravo ! Résultat exact !" << endl;
else
cout << "Désolé... Mauvaise réponse." << endl;
cout << endl;
}

return 0;
}

Efficacement,
Nowhere man
--

OpenPGP 0xD9D50D8A

1 2 3