Oppure

Loading
15/01/14 17:08
pierotofy
Postato originariamente da ZioCrocifisso:
ma anche di conservare Random, invece di crearne uno per ogni chiamata a LancioDado. Mettilo dunque come campo di Dado, e crealo nel costruttore.


Random va dichiarato come membro della classe, inizializzato nel costruttore, e richiamato da LancioDado.
Il mio blog: piero.dev
15/01/14 17:08
ZioCrocifisso
Non devi creare e conservare il risultato di Random, ma l'oggetto Random stesso. Il motivo è che esso non restituisce realmente numeri casuali, ma pseudocasuali, che vengono ottenuti tramite una formula: questa genera una sequenza di numeri in base a un seed, che su Random è il tempo (ma puoi deciderlo tu). Se crei diverse istanze di Random nello stesso istante, queste avranno lo stesso seed e genereranno le stesse sequenze di numeri, e poiché prendi solo il primo numero di quella sequenza (Next, come si può intuire dal nome, prende il prossimo numero), visto che stai usando istanze diverse, sarà sempre lo stesso.
Ultima modifica effettuata da ZioCrocifisso 15/01/14 17:09
aaa
15/01/14 17:34
Dice
Ho provato a fare così:

public class Dado
    {
        private int risultato;      //risultato del lancio del dado
        
       Random rnd;

        //costruttore
        public Dado()
        {
            rnd = new Random();
            //invoco il metodo per il lancio del dado
            this.LancioDado();
        }
        //metodo per lanciare il dado
        public void LancioDado()
        {
            //ottengo un numero casuale tra 1 e 6
            risultato = rnd.Next(1, 7);
        }
        //proprietà per far ritornare il risultato del lancio del dado
        public int Risultato
        {
            get { return risultato; }
        }
    }


Ma mi da ancora i numeri sempre uguali :(
aaa
15/01/14 17:46
ZioCrocifisso
Hai lasciato i cambiamenti inutili di prima (riguardo al risultato), quindi non so come lo usi adesso LanciaDado. Posta anche il codice con cui lo usi.
Comunque dovresti sforzarti di capire come funziona, invece di chiedere cosa cambiare senza capirci niente, altrimenti riavrai lo stesso problema in futuro.
aaa
15/01/14 19:03
Dice
Per caso quello che sbaglio è che calcolo il risultato del lancio fuori dal costruttore?
Devo mettere anche il calcolo del risultato nel costruttore ed eliminare il metodo LanciaDado?
aaa
15/01/14 19:27
ZioCrocifisso
...
aaa
15/01/14 20:47
tuttodiMC
Potresti provare a creare tu un generatore di numeri pseudocasuali in modo da gestire meglio il tutto.
Per esempio potresti provare una cosa simile

risultato = rnd.Next(1,101) % 6;


Ma mettendo al posto di quel 6 una variabile di un ciclo for che viene incrementata in continuazione, in questo modo avrai per forza numeri diversi.
Ultima modifica effettuata da tuttodiMC 15/01/14 20:55
aaa
16/01/14 8:52
Ultimo
Come ti è stato detto è normale che ti escano i numeri uguali, perchè i 5 lanci vengono effettuati praticamente
nello stesso istante, quindi il seed(seme) della funzione Random che genera una sequenza pseudocasuale sarà
sempre lo stesso.
Quindi per risolvere il problema o fai trascorrere del tempo tra un lancio e l'altro, oppure nella classe Dado
inserisci un Array che rappresenti le sei facce del Dado, e nel costruttore della classe avvii una procedura
che ne mischia il suo ordine, in modo tale da avere sempre delle sequenze diverse.

Una soluzione semplice:

 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;

namespace APP_Lancio_del_Dado
{
    class Program
    {
       

        static void Main(string[] args)
        {

        int risultato1 = 0;
        int risultato2 = 0;
        int risultato3 = 0;
        int risultato4 = 0;
        int risultato5 = 0;
       
            //istanzio un'oggetto della classe Dado
            Dado dado = new Dado();

    while (true)
	{
        //lancio i dadi e memorizzo i risultati
        risultato1 = dado.LancioDado();
        System.Threading.Thread.Sleep(300);
        risultato2 = dado.LancioDado();
        System.Threading.Thread.Sleep(300);
        risultato3 = dado.LancioDado();
        System.Threading.Thread.Sleep(300);
        risultato4 = dado.LancioDado();
        System.Threading.Thread.Sleep(300);
        risultato5 = dado.LancioDado();
        System.Threading.Thread.Sleep(300);
        //stampo i risultati
        Console.WriteLine(" Risultato dei 5 Lanci del Dado:  ");
        Console.WriteLine("  " + risultato1 + " " + risultato2 + " " + risultato3 + " " + risultato4 + " " + risultato5 + "\n\n");

        Console.ReadKey();          
    }
        }

        /// <summary>
        /// Oggetto Dado
        /// </summary>
        public class Dado
        {
            private int risultato;      //risultato del lancio del dado

            Random rnd;

            //costruttore
            public Dado()
            {
                rnd = new Random();

                risultato = 0;
            }
            //metodo per lanciare il dado
            public int LancioDado() 
            {
                rnd = new Random();
                //ottengo un numero casuale tra 1 e 6
                risultato = rnd.Next(1, 7);

                return risultato;
            }
          
            
        }

    }
}
 
Ultima modifica effettuata da Ultimo 16/01/14 9:32
If ok Then GOTO Avanza else GOTO Inizia