Instancier un objet, random, temps

Signaler
-
Messages postés
14746
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
16 septembre 2020
-
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

Messages postés
14746
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
16 septembre 2020
431
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)
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.
Messages postés
14746
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
16 septembre 2020
431
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.