Je suis confronté à un souci… Je suis actuellement occupé à suivre le cours suivant, Apprenez à développer en c#.
Jusqu'à présent je m'en sortais à peu près bien, sauf qu'arrivé au travail à rendre, je rencontre un couac.
- Je dois générer 7 nombres aléatoires et les ranger dans un tableau : fait.
- Je dois faire en sorte que les nombres ne soient pas identiques : fait. Et ca m'a l'air de marcher, je n'ai pas encore eu de doublons en une 10aine d'exécutions.
- Je dois générer des nombres compris entre 1 et 49 inclus : plantage total!
Ma borne supérieure semble ne pas être respectée, je vois régulièrement des nombres au dessus de 49 (entre 1 et 2 par tirage), et je ne comprends pas pourquoi, si quelqu'un peut donc éclairer ma lanterne...
Peut être que j'utilise mal le random?
Je vous montre le code que j'ai produit :
using System;
using System.Collections.Generic;
namespace cours
{
class Program
{
static void Main(string[] args)
{
int[] tirage = new int[7];
Random aleatoire = new Random();
for (int i = 0; i < tirage.Length; i++)
{
bool dejaPresent = false;
do
{
int resultat = aleatoire.Next(1, 50);
foreach (int element in tirage)
{
if (element == resultat)
{
dejaPresent = true;
}
}
if (!dejaPresent)
{
tirage[i] = resultat;
}
} while (!dejaPresent);
}
foreach (int element in tirage)
{
Console.WriteLine(element + '\n');
}
}
}
}
Je crois que je viens de comprendre… serait-il possible que l'affichage seulement soit en cause?
J'ai viré le '\n' que j'ajoutais (pour passer la ligne, ce qui est en plus inutile car writeline le fait d'office, vieille habitude des chaines en c++ lol)
Du coup je ne rencontre a priori plus le souci...
Serait-il possible que mon expression " element + '\n' " soit évaluée avant d'être affichée?
J'ai debuggé ton programme et la fonction aléatoire fonctionne bien, "resultat" ne prend jamais de valeur >50, mais l'affichage montre certaines valeurs >50
Pour moi ca vient du fait que tu affiches tes valeurs INT sans .ToString(). J'ai modifié ta ligne 34 en "Console.WriteLine(element.ToString());" et cela ne s'est plus reproduit.
Sinon tu devrais utiliser des List tu te prendrais moins la tête pour vérifier si un élement est déjà présent, parce que la niveau perfomance c'est vraiment pas ca
En esperant t'avoir aidé
EDIT : j'ai vu ta réponse, si cela ne se reproduit plus c'est que ca venait de là, étonnant cependant..
Dan ton exemple, je pense que c'est ce que tu fais. sachant que tu commence le WriteLine() par un int et que le caractère suivit est échappé (donc je suppose pas considéré comme un string).
static void Main(string[] args)
{
int[] tirage = new int[7];
Random aleatoire = new Random();
bool dejaPresent = false;
for (int i = 0; i < tirage.Length; i++)
{
do
{
dejaPresent = false;
int resultat = aleatoire.Next(1,49);
if (tirage.Contains(resultat)) dejaPresent = true;
if (!dejaPresent) tirage[i] = resultat;
} while (dejaPresent);
}
foreach (int element in tirage)
{
Console.WriteLine(element.ToString());
}
Console.ReadKey();
}
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Cours de C++ moderne
Cours de C++ moderne
Try->Fail->Learn->Converge to success :
Cours de C++ moderne