Instancier un objet, random, temps

Anonyme - Modifié le 30 mai 2020 à 20:38
Whismeril Messages postés 17805 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 27 septembre 2022 - 30 mai 2020 à 21:29
Bonjour,

Premièrement le code :

using System;

namespace test
{
    class Program
    {
        static void Main(string[] args)
        {
            Personnage perso1 = new Personnage();
            //System.Threading.Thread.Sleep(1000);
            Personnage perso2 = new Personnage();

            while (true)
            {
                Console.WriteLine("Perso1 :");
                perso1.LanceurDe();
                Console.WriteLine("Perso2 :");
                perso2.LanceurDe();
                System.Threading.Thread.Sleep(1000);
            }
        }
    }
}


using System;

namespace test
{
    public class Personnage
    {
        private De De;

        public Personnage()
        {
            De = new De();
        }

        public void LanceurDe()
        {
            Console.WriteLine(De.LancerDe());
        }
    }
}


using System;

namespace test
{
    public class De
    {
        private Random random;

        public De()
        {
            random = new Random();
        }

        public int LancerDe()
        {
            return random.Next(0, 100);
        }
    }
}


Deuxièmement, la logique voudrait que si on ne met pas en commentaire le :
//System.Threading.Thread.Sleep(1000);
.
Le programme devrait avoir le même comportement, mais quand je laisse commenté les deux personnage à chaque tour, on le même tirage de dé. Alors que si la ligne n'est pas commenté le tirage est différent entre les deux personnages (fonctionnement voulu). Je dois bien avouer que je ne comprend pas du tout la raison de cette différence Si quelqu'un aurait une réponse je serai ravi de l'entendre.

Bien à vous

P.S : Ce n'est pas un programme complet, c'est juste pour mettre en lumière le problème. Et désolé pour les fautes de français éventuelles.

2 réponses

Whismeril Messages postés 17805 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 27 septembre 2022 618
30 mai 2020 à 20:47
Bonjour

il faut savoir qu'un random, ça n'est pas aléatoire, c'est une loi mathématique.

Ce qui fait qu'elle semble aléatoire c'est qu'elle a besoin d'une valeur d'initialisation dont dépendent les résultats suivants.

Quand tu ne lui donne pas de valeur, elle prend l'heure (ou la date et l'heure) à la seconde.
Donc si tu initialises par défaut 2 randoms dans la même secondes, ils retournent la même chose.

Option 1, tu n'initialises qu'un seul dé, que tu passes en paramètre à tes personnages.

Option 2 tu initialises les dés avec un valeur différentes (le tick de datetime.Now par exemple)
1
Donc quand j'instancie les deux random au même moment il garde en mémoire le moment où il ont été créé, je pensais que c'était lors du
random.Next(0, 100);
qu'ils récupéraient l'heure. Du coup c'est plus clair. Je trouve ton option 1 plus intéressante. Merci beaucoup.
0
Whismeril Messages postés 17805 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 27 septembre 2022 618
30 mai 2020 à 21:29
De rien

moi aussi je préfère l'option 1, c'est même pour ça que je te l'ai mise en 1.

Pense à marquer le sujet résolu.
0