Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - di nuovo problemi coi numeri casuali
Forum - C# / VB.NET - di nuovo problemi coi numeri casuali - Pagina 2

Pagine: [ 1 2 3 4 ] Precedente | Prossimo
Avatar
tuttodiMC (Normal User)
Expert


Messaggi: 327
Iscritto: 29/10/2012

Segnala al moderatore
Postato alle 15:59
Martedì, 14/01/2014
Esattamente come ha detto Poggi Marco,  dovresti mettere la variabile rnd al di fuori del metodo in modo da non crearla nuovamente quando riutilizzi il metodo. In questo modo tu hai tirato fuori lo stesso problema dell'altra discussione, ovvero, che inizializzavi più dadi con lo stesso seme.

PM Quote
Avatar
Dice (Normal User)
Expert


Messaggi: 238
Iscritto: 26/11/2011

Segnala al moderatore
Postato alle 18:48
Martedì, 14/01/2014
Ok ragazzi, adesso ho un problema che non mi era mai capitato:

ho fatto come mi avete detto, cioè ho creato solo una istanza del dado e ho fatto 5 lanci con quella istanza;
io so che questo metodo come mi avete detto voi funziona perché ho verificato anche con il debugger che vengano fuori cinque risultati diversi, e va benissimo.

Il fattaccio è che quando eseguo il programma NON LO FA :om:
mi mette sempre i risultati tutti uguali, sempreeee!

Ma perchèè????  Nel debugger ho visto istruzione per istruzione e andava benissimo, ma quando lo eseguo cambia. Che roba è mai questa??

PM Quote
Avatar
ZioCrocifisso (Member)
Pro


Messaggi: 135
Iscritto: 06/03/2013

Segnala al moderatore
Postato alle 19:01
Martedì, 14/01/2014
Testo quotato

Postato originariamente da ZioCrocifisso:

Conserva l'oggetto Random su Dado (creato nel costruttore) e usalo su LancioDado, usando un solo dado, perché creando più oggetti Random nello stesso istante li crei tutti con lo stesso seme, e quindi generano la stessa sequenza.


PM Quote
Avatar
Dice (Normal User)
Expert


Messaggi: 238
Iscritto: 26/11/2011

Segnala al moderatore
Postato alle 19:18
Martedì, 14/01/2014
Ho detto che quella cosa l'ho gia corretta:
adesso ho istanziato un solo oggetto dado e lanciato 5 volte; ho detto che ho anche verificato con il debugger che funziona.

La cosa che mi sembra impossibile è che mi funziona bene solo quando uso il debugger, mentre quando lo vado ad eseguire mi da sempre i 5 risultati uguali :(

Se per caso ho sbagliato a creare la classe dado mi potreste mettere il codice di come modificarlo perfavore?
Perchè sto quasi per impazzire; ho fatto mille prove diverse, ma non ce la faccio :(

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 19:32
Martedì, 14/01/2014
Posta il codice...


Il mio blog: https://piero.dev
PM Quote
Avatar
ZioCrocifisso (Member)
Pro


Messaggi: 135
Iscritto: 06/03/2013

Segnala al moderatore
Postato alle 20:46
Martedì, 14/01/2014
In quel post non ho scritto solo di usare un'istanza di Dado, ma anche di conservare Random, invece di crearne uno per ogni chiamata a LancioDado. Mettilo dunque come campo di Dado, e crealo nel costruttore.
Ti ho anche spiegato il motivo per cui facendo come hai fatto tu non funziona, che probabilmente spiega anche perché col debugger ti funziona e senza no: eseguendo il programma passo passo, i vari Random vengono creati in momenti diversi, e quindi con un diverso seed.

Ultima modifica effettuata da ZioCrocifisso il 14/01/2014 alle 20:48
PM Quote
Avatar
Dice (Normal User)
Expert


Messaggi: 238
Iscritto: 26/11/2011

Segnala al moderatore
Postato alle 17:49
Mercoledì, 15/01/2014
Allora, ho modificato la mia classe Dado in questo modo:

Codice sorgente - presumibilmente C++

  1. public class Dado
  2.     {
  3.         private int risultato;      //risultato del lancio del dado
  4.         //costruttore
  5.         public Dado()
  6.         {
  7.             //invoco il metodo per il lancio del dado
  8.             this.LancioDado();
  9.         }
  10.         //metodo per lanciare il dado
  11.         public void LancioDado()
  12.         {
  13.             //istanzio un oggetto di tipo random
  14.             System.Random rnd = new System.Random();
  15.            
  16.             //ottengo un numero casuale tra 1 e 6
  17.             risultato = rnd.Next(1, 6);
  18.         }
  19.         //proprietà per far ritornare il risultato del lancio del dado
  20.         public int Risultato
  21.         {
  22.             get { return risultato; }
  23.         }
  24.     }



E nel codice vado a fare questo:

Codice sorgente - presumibilmente C# / VB.NET

  1. //istanzio un'oggetto della classe Dado
  2.                             Dado dado = new Dado();
  3.                             //lancio i dadi e memorizzo i risultati
  4.                             risultato1 = dado.Risultato;
  5.                             risultato2 = dado.Risultato;
  6.                             risultato3 = dado.Risultato;
  7.                             risultato4 = dado.Risultato;
  8.                             risultato5 = dado.Risultato;



Ma non riesco a risolvere il mio problema :(

questa volta ho fatto come mi avete detto: ho creato il numero casuale nel costruttore (attraverso un metodo)
ma non mi va, perchè? Dove sbaglio?

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 18:08
Mercoledì, 15/01/2014
Testo quotato

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: https://piero.dev
PM Quote
Pagine: [ 1 2 3 4 ] Precedente | Prossimo