Random en boucle do...while

Messages postés
16
Date d'inscription
vendredi 21 mars 2008
Statut
Membre
Dernière intervention
6 janvier 2010
- - Dernière réponse : N3N3SS
Messages postés
16
Date d'inscription
vendredi 21 mars 2008
Statut
Membre
Dernière intervention
6 janvier 2010
- 4 nov. 2008 à 11:45
Salut tout le monde !

Bon alors voila, j'expose mon piti problème :

Lors de mon premier programme en C#, j'ai voulu tester la fonction Random, chose que je n'avais jamais testée...
Mon code ressemblait alors à ceci :<sup>
#############################################################################################################
String keyt1, keyt2, keyt3;

            do
            {
                Random Rand = new Random();

                int keyx1 = Rand.Next(1000, 9999);
                int keyx2 = Rand.Next(1000, 9999);
                int keyx3 = Rand.Next(1000, 9999);
               
            } while (keyx1 + keyx2 + keyx3 / 2 == 15000);
           
                chmpkey.Text = keyt1 + " - " + keyt2 + " - " + keyt3;          
            }
</sup>
##################################################################################################

Une boucle tout ce q'il y de plus basique utilisée dans le but de recommencer le random jusqu'à que la somme de keyx1, keyx2 et keyx3 divisée par 2 soit égale à 15000.

Il m'est alors donnée une erreur, plutot 3 erreurs identiques :
Erreur    1    Le nom 'keyx1' n'existe pas dans le contexte actuel.
Erreur    2    Le nom 'keyx2' n'existe pas dans le contexte actuel.
Erreur    3    Le nom 'keyx3' n'existe pas dans le contexte actuel.

J'ai essayé plusieurs méthodes (pointer ou plutot référencer un variable keyp1 vers keyx1 etc...) mais rien à faire...
Je ne sais pas si c'est du à un mauvais code ou à autre chose.
Ce serait vraiment sympa de m'apporter de l'aide surtout que pour certains ceci équivaut un bon vieux "Hello world". ^^"

Merci d'avance, N3N3SS.
Afficher la suite 

5 réponses

Messages postés
327
Date d'inscription
mardi 17 février 2004
Statut
Membre
Dernière intervention
10 avril 2010
5
0
Merci
Salut,

Declare keyx1,keyx2 et keyx3 a l'exterieur de la boucle, parce que sinon le compilateur ne les reconnait qu'a l'interieur des parentheses

Aussi:
-si tu veux que la somme des 3 variables divisees par 2 soit egale a 15000, tu dois ajouter des parentheses:
...
while((keyx1+keyx2+keyx3)/2==15000)

-tu n'a pas besoin de redeclarer un objet Random a toutes les iterations, tu peux le declarer une fois a l'exterieur de la boucle

- tu n'as pas l'air d'avoir besoin de keyt1 , keyt2, keyt3.

tu peux faire
champKey.Text = keyx1.ToString() + " - " keyx2.Tostring()+ " - " + keyx3.ToString();
ou champKey.Text = string.Format("{0} - {1} - {2}",keyx1.ToString(),keyx2.ToString(), keyx3.ToString());
Commenter la réponse de WishhhMaster
Messages postés
16
Date d'inscription
vendredi 21 mars 2008
Statut
Membre
Dernière intervention
6 janvier 2010
1
0
Merci
Tout d'abord merci d'avoir répondu WishhhMaster mais j'avais malheureusement déja testé cette possibilité.

Si je déclare mes keyx comme suit :
int keyx1, keyx2, keyx3;
ou :
var keyx1, keyx2, keyx3;

Les erreurs suivantes me sont données :
- Erreur 1 Une variable locale nommée 'keyx1' ne peut pas être déclarée dans cette portée, car elle modifierait la signification de 'keyx1', déjà utilisée dans une portée 'parent ou en cours' pour désigner autre chose.

- Erreur 2 Une variable locale nommée 'keyx2' ne peut pas être déclarée dans cette portée, car elle modifierait la signification de 'keyx2', déjà utilisée dans une portée 'parent ou en cours' pour désigner autre chose.

- Erreur 3 Une variable locale nommée 'keyx3' ne peut pas être déclarée dans cette portée, car elle modifierait la signification de 'keyx3', déjà utilisée dans une portée 'parent ou en cours' pour désigner autre chose.

Merci pour l'histoire des parathèses et des strings ,,, quand meme et si tu(vous) as(avez) d'autres propositions n'hésite(z) pas.

Merci d'avance, N3N3SS.
Commenter la réponse de N3N3SS
Messages postés
327
Date d'inscription
mardi 17 février 2004
Statut
Membre
Dernière intervention
10 avril 2010
5
0
Merci
Salut,

-Ne les declare qu'une seule fois, a l'exterieur de la boucle.D'apres ton message d'erreur, je parie que tu a laisse int keyx1 Rand.Next(1000, 9999); a l'interieur de la boucle aussi. Garde seulement keyx1 Rand.Next(1000, 9999) a l'interieur (sans le int)
-Sinon dans la condition while, tu veux stopper quand la some divisee par 2 est 15000, mais ce que tu as ecrit ca va executer la boucle TANT que la somme divisee par 2 est 15000. Utilise !au lieu de.

Essaye ce code

int keyx1, keyx2, keyx3;
            Random Rand = new Random();
            do
            {
                keyx1 = Rand.Next(1000, 9999);
                keyx2 = Rand.Next(1000, 9999);
                keyx3 = Rand.Next(1000, 9999);
            }
            while ((keyx1 + keyx2 + keyx3) / 2 != 15000);

Dernier truc.. je ne sais pas ce que tu veux faire, mais comme c'est des nombres aleatoire ton programme peut prendre 2 minutes ou 2 mois avant de trouver une solution :p
Commenter la réponse de WishhhMaster
Messages postés
1024
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
7 juin 2010
51
0
Merci
Hello,

Je voulais juste ajouter mon grain de sel à cette discussion.

Tout d'abord deux détails :

Je pense que tu aimerais avoir des nombre entre 1000 et 9999. Dans ce as, il faut faire Rand.Next(1000,10000);

Le deuxième nombre est une borne exclusive. Il s'arrêtera donc à 9999.


Deuxièmement, si tu tires 3 nombres qui valent au max 9999, la somme divisée par 2 donneras au maximum 14998.

Ensuite, une petite explication des nombres aléatoires en programmation:

En effet, les nombres aléatoires n'éxistent pas en informatique, il n'y a que des nombres pseudo-aléatoires.
La différence, c'est que un Random est en fait comme une fonction mathématique, qui renvoie un nombre en fonction d'un x précis.
Lorsqu'on fait un new Random, il y a un 2ème constructeur qui prend un seed (ou graine en français). Si on précise ce seed, la suite donnée en appelant Next sera toujours la même.
Si on ne précise pas le seed, le constructeur prend comme seed le nombre de millisecondes depuis le démarrage du système (on peut le vérifier facilement avec Reflector).
Donc, si on initialise un Random dans une boucle, et que cette boucle met moins d'une milliseconde pour s'éxécuter, la prochaine itération aura les mêmes valeurs.
Il ne faudrait donc jamais créer une variable Random à l'intérieur d'une boucle.

Ensuite, deux détails,

Amicalement, SharpMao

"C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!"
(Coluche / 1944-1986 / Pensées et anecdotes)
Commenter la réponse de SharpMao
Messages postés
16
Date d'inscription
vendredi 21 mars 2008
Statut
Membre
Dernière intervention
6 janvier 2010
1
0
Merci
Re ! slt tlm.

Eh bien merci pour vos expliquations, c'est bon mon pti test marche :)
Encore merci a tt le monde et @+, ;)
N3N3SS,
Commenter la réponse de N3N3SS