Problème de random... [Résolu]

razatajm16 14 Messages postés mardi 1 juin 2004Date d'inscription 7 mars 2008 Dernière intervention - 2 nov. 2007 à 20:23 - Dernière réponse : Kristof_Koder 920 Messages postés vendredi 3 août 2007Date d'inscription 27 octobre 2008 Dernière intervention
- 3 nov. 2007 à 00:41
Bonjour,
j'ai un petit problème dans un programme que je dois faire.
en fait l'exo c'était d'écrire un jeu de devinette ou l'ordinateur jouerais contre lui même.
-On entre une borne supérieur.
-Ensuite l'ordi fait un random rand()%borne; de 0 a cette borne supérieur:
      il choisit ainsi un chiffre entre 0 et cette borne, et ce chiffre sera LE chiffre A DEVINER qui sera dans la variable random1.
-ensuite on entre dans une procédure nommé "test" dans laquel on a l'appel d'une fonction "essai", et un enchainement de "if" :
  la fonction "essai" on va dire que c'est l'ordi proprement dit qui fait un random entre 0 et la borne saisie, et renvoie cette valeur dans la procédure "test" , dans une variable "var".
Ensuite les "if": si var < random1
                        afficher "le chiffre a deviner est plus grand"
               
                        si var > random1
                        afiicher "le chiffre a deviner est plu peti"

                        si var == random1
                        aficher " j'ai gagné!"

et donc normalement tant que var pas égale a random1(chiffre a deviner) la fonction "essai" doit refaire un random entre 0 et la borne sup, pour avoir de nouveau un autre chiffre que l'on testera de nouveau dans les "if".

Enfin voila, le problème c'est que l'ordi lorsqu'il fait un premier random, nou renvoie donc var, le problème c'est que dès ce premier random , il trouve directement le BON chiffre à deviner ... (qui est random1)

alors dans la fonction random (celui qui permet grace a une borne saisi) de choisir LE chiffre a deviner, j'ai écris la ligne de code comme ceci

int random(int x)
{
   srand(int() time(null))
   int rand1;

   rand1=rand()%x;  //x sera remplacé par "borne" saisi par l'utilisateur

   return(rand);
}

et la deuxieme fonction "essai" qui permet a l'ordi de choisir un chiffre un chiffre (essai donc de deviner le chiffre) je l'ai écrit comme ceci

int essai(int y)
{
   srand(int() time(null))
   int rand2;

   rand2=rand()%y;  //y sera remplacé par "borne" saisi par l'utilisateur

   return(rand2);
}

alors petit j'essai pour bien expliquer:

 Affcihage a l'écran:
         
         Saisir une borne: 10 (prenons par exemple 10 pour la borne sup)  >>borne=10
//a ce niveau la fonction random(borne) est appelé >> borne en paramètre d'entré et return(rand1) , stocké dans random1
         Un chiffre entre 0 et 10 a été choisi et je dois le deviner 
//on fait un petit trace "le chiffre a deviner est: 5" (par exemple 5 est le chiffre a deviner)
        essai 1:
//ici la fonction essai(borne) est appelé >> borne en parametre d'entré, la fonction essai simule l'ordinateur qui essai de deviner un chiffre

il affiche alors 5

      Je gagne, le chiffre a deviner était bien 5.

voilà en gros.Moi j'ai juste un epetite idée, ne serais ce pas un problème de mémoire ?... au niveau du random ... je comprend pas très bien en fait. comment ça se fait que mon deuxieme random dans la fonction "essai()" trouve directement la même valeur que le premier random dans la fonction random()...?

voilà merci d'avance.
-=Tinou=-
Afficher la suite 

Votre réponse

14 réponses

Meilleure réponse
f0xi 4304 Messages postés samedi 16 octobre 2004Date d'inscription 9 mars 2018 Dernière intervention - 2 nov. 2007 à 20:35
3
Merci
int random(int min, int max){
  return (int) (min + ((float) rand() / RAND_MAX * (max - min + 1)));
}

void main{
  srand(time(null));    
  // ... 
}

<hr size="2" width="100%" />
http://deefaze.gnomz.com

Merci f0xi 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 96 internautes ce mois-ci

Commenter la réponse de f0xi
Meilleure réponse
razatajm16 14 Messages postés mardi 1 juin 2004Date d'inscription 7 mars 2008 Dernière intervention - 2 nov. 2007 à 21:53
3
Merci
ok meric je test ça tout de suite, mais je comprend pas le rôle de min et max là?..; à quoi correspondent -ils? on fait min + ((float) rand() / RAND_MAX * (max - min + 1))) mias min et max ont quoi comme valeur ?...

-=Tinou=-

Merci razatajm16 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 96 internautes ce mois-ci

Commenter la réponse de razatajm16
Meilleure réponse
chaibat05 1884 Messages postés samedi 1 avril 2006Date d'inscription 20 novembre 2007 Dernière intervention - 2 nov. 2007 à 23:09
3
Merci
Bonsoir,
si je me souviens bien, le random ne se fait qu' une seule fois 
au début de chaque partie.Ensuite tu (ou l' ordi) essaies de deviner en divisant ( borne inférieure+ borne supérieure) par 2.
Au lieu d' un nouveau random, le nombre à tester sera
égale au résultat de cette division.
Et ça jusqu' à ce que la différence entre B supérieure et B
inférieure n' est plus que de 1.
Et donc si c' est pas l' un c' est l' autre.
Et rebelotte:Nouvelle partie=>nouveau Random.
On arrive même à savoir au début de chaque partie,
le nombre maximal de tentatives pour deviner le nombre en question.




Au début
-On entre une borne supérieur Max.
-Si on entre une borne inférieure Min=0, sinon Min=le nombre entré.


Après dans ta  fonction test
si var < (Min+Max)/2
    afficher "le chiffre a deviner est plus grand"
    Min=var
    var=(Min+Max)/2


si var > (Min+Max)/2
     afiicher "le chiffre a deviner est plu peti"
    Max=var
     var=(Min+Max)/2

 si var == (Min+Max)/2
Afficher "trouvé"


et tu relances de nouveau le test avec la
nouvelle valeur de var si c' est pas trouvé

sinon, tu relances une nouvelle partie avec un
nouveau Random.


<hr />

I LIKE TO BE HERE WHEN I CAN


<hr />

Merci chaibat05 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 96 internautes ce mois-ci

Commenter la réponse de chaibat05
Meilleure réponse
chaibat05 1884 Messages postés samedi 1 avril 2006Date d'inscription 20 novembre 2007 Dernière intervention - 2 nov. 2007 à 23:12
3
Merci
Si on n' entre PAS une borne inférieure Min=0, sinon Min=le nombre entré.

<hr />I LIKE TO BE HERE WHEN I CAN
<hr />

Merci chaibat05 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 96 internautes ce mois-ci

Commenter la réponse de chaibat05
Meilleure réponse
chaibat05 1884 Messages postés samedi 1 avril 2006Date d'inscription 20 novembre 2007 Dernière intervention - 2 nov. 2007 à 23:22
3
Merci
exemple concret:
Deviner un nombre entre 0 et 50
Je propose 25
1° X > 25 ==> il est entre 25 et 50
je repropose donc 38

--1° X > 38==> il est entre 38 et 50
--2° X < 38 ==> il est entre 25 et 38
et ainsi de suite.

2° X < 25 ==> il est entre 0 et 25
je repropose donc 13


--1° X > 13 ==> il est entre 13 et 25
--2° X < 13 ==> il est entre 0 et 13
et ainsi de suite.


PS: Avec le random à chaque essai,
tu auras plus de tentatives qu' avec la division par 2.

Si c' est l' ordi qui devise fais lui faire ce calcul ..











<hr />

I LIKE TO BE HERE WHEN I CAN


<hr />

Merci chaibat05 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 96 internautes ce mois-ci

Commenter la réponse de chaibat05
Meilleure réponse
f0xi 4304 Messages postés samedi 16 octobre 2004Date d'inscription 9 mars 2018 Dernière intervention - 2 nov. 2007 à 23:23
3
Merci
min et max sont les bornes inferieur et superieur du chiffre a sortir par random :
random(0,100) donne un nombre entre 0 et 100
random(-100,100) donne un nombre entre -100 et 100

srand(time(null)); ne s'appel qu'au debut du programme

<hr size="2" width="100%" />
http://deefaze.gnomz.com

Merci f0xi 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 96 internautes ce mois-ci

Commenter la réponse de f0xi
Meilleure réponse
razatajm16 14 Messages postés mardi 1 juin 2004Date d'inscription 7 mars 2008 Dernière intervention - 2 nov. 2007 à 23:28
3
Merci
OKi. je vous remercie! je vais étudier tout cela. et en cas d'incompréhension je laisserais un post.

-=Tinou=-

Merci razatajm16 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 96 internautes ce mois-ci

Commenter la réponse de razatajm16
Meilleure réponse
chaibat05 1884 Messages postés samedi 1 avril 2006Date d'inscription 20 novembre 2007 Dernière intervention - 2 nov. 2007 à 23:33
3
Merci
@fOXI,
à mon avis le random n' a même pas lieu d' être..
Tu vas directement à la moitié de BonrneInf+BorneMax.

Bonne continuation razarajm et bonne fin de soirée à vous deux

<hr />I LIKE TO BE HERE WHEN I CAN
<hr />

Merci chaibat05 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 96 internautes ce mois-ci

Commenter la réponse de chaibat05
Meilleure réponse
razatajm16 14 Messages postés mardi 1 juin 2004Date d'inscription 7 mars 2008 Dernière intervention - 2 nov. 2007 à 23:38
3
Merci
J'avoue que l'astuce de la division par deux j'avais pas pensé ... c'est malin :) j'essayerais avec cette méthode je te tiendrais au courant.
merci.
-=Tinou=-

Merci razatajm16 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 96 internautes ce mois-ci

Commenter la réponse de razatajm16
Meilleure réponse
razatajm16 14 Messages postés mardi 1 juin 2004Date d'inscription 7 mars 2008 Dernière intervention - 2 nov. 2007 à 23:39
3
Merci
(suite) vu que j'ai commencé avec le random je termine quand même mais la c'est en bonne voie :) ça bug moins ..

-=Tinou=-

Merci razatajm16 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 96 internautes ce mois-ci

Commenter la réponse de razatajm16
Meilleure réponse
Kristof_Koder 920 Messages postés vendredi 3 août 2007Date d'inscription 27 octobre 2008 Dernière intervention - 2 nov. 2007 à 23:54
3
Merci
A noter que la recherche d'une valeur par division de l'espace de recherche se nomme la dichotomie (voir http://fr.wikipedia.org/wiki/Dichotomie)

Merci Kristof_Koder 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 96 internautes ce mois-ci

Commenter la réponse de Kristof_Koder
Meilleure réponse
chaibat05 1884 Messages postés samedi 1 avril 2006Date d'inscription 20 novembre 2007 Dernière intervention - 2 nov. 2007 à 23:58
3
Merci
tu ne comptes pas faire la même chose avec ton "compte" en Suisse, j' espère !
Il n' en restera rien

Je sors ..

<hr />I LIKE TO BE HERE WHEN I CAN
<hr />

Merci chaibat05 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 96 internautes ce mois-ci

Commenter la réponse de chaibat05
Meilleure réponse
razatajm16 14 Messages postés mardi 1 juin 2004Date d'inscription 7 mars 2008 Dernière intervention - 3 nov. 2007 à 00:01
3
Merci
Huhu!..

-=Tinou=-

Merci razatajm16 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 96 internautes ce mois-ci

Commenter la réponse de razatajm16
Meilleure réponse
Kristof_Koder 920 Messages postés vendredi 3 août 2007Date d'inscription 27 octobre 2008 Dernière intervention - 3 nov. 2007 à 00:41
3
Merci
Non ... mon compte, je lui appliquerai plutot volontier un calcul exponentiel !

Merci Kristof_Koder 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 96 internautes ce mois-ci

Commenter la réponse de Kristof_Koder

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.